AUTO_INCREMENT কলামে সারি ডিলিট হলে গ্যাপ পড়ে (যেমন ১, ৩, ৫)। এই গ্যাপ বাদ দিয়ে সিকোয়েন্স ১, ২, ৩... করে ফেলতে ইউজার-ডিফাইনড ভেরিয়েবল সহ UPDATE ব্যবহার করা হয়।
টেবিল ও ডেটা তৈরি
mysql> CREATE TABLE DemoTable1955 (
UserId INT NOT NULL AUTO_INCREMENT PRIMARY KEY
);
mysql> INSERT INTO DemoTable1955 VALUES (), (), (), (), (); -- ১,২,৩,৪,৫
কিছু সারি ডিলিট
mysql> DELETE FROM DemoTable1955 WHERE UserId IN (2, 4);
ডিলিটের পর (গ্যাপ আছে)
mysql> SELECT * FROM DemoTable1955;
+--------+ | UserId | +--------+ | 1 | | 3 | | 5 | +--------+
Re-sequence কোয়েরি: ১,২,৩ করা
mysql> UPDATE DemoTable1955
SET UserId = (@increment_value := @increment_value + 1)
ORDER BY UserId;
ব্যাখ্যা:
@increment_value— সেশন ভেরিয়েবল, ডিফল্ট NULL (০ হয়ে যায়)।ORDER BY UserId— বর্তমান ক্রম অনুযারি আপডেট (সিকোয়েন্স মেইনটেইন করতে বাধ্যতামূলক)।:=— অ্যাসাইনমেন্ট অপারেটর (SET-এ = ও কাজ করতো, কিন্তু SELECT/UPDATE-এ := লাগে)।
আউটপুট: Query OK, 2 rows affected (0.00 sec)
ফলাফল যাচাই
mysql> SELECT * FROM DemoTable1955;
+--------+ | UserId | +--------+ | 1 | | 2 | | 3 | +--------+
⚠️ সতর্কতা এবং সীমাবদ্ধতা
- প্রাইমারি কী আপডেট করা রিস্কি: ফরেন কী রেফারেন্স থাকলে ব্রেক হবে (ON UPDATE CASCADE না থাকলে)।
- কানকারেন্সি: একই সময় অন্য ট্রানজ্যাকশন ইনসার্ট করলে ডুপ্লিকেট কী এরর হতে পারে।
- AUTO_INCREMENT কাউন্টার: এটি
MAX(UserId)+1রিসেট করে না। পরবর্তী ইনসার্টে ৪ আশবে। রিসেট করতে:ALTER TABLE DemoTable1955 AUTO_INCREMENT = 4; - প্রোডাকশনে এড়িয়ে চলুন: সারোগেট কী (Surrogate key) কখনো রিনাম্বার করা উচিত নয়। বদলে নতুন সিকোয়েন্স কলাম যোগ করুন।
সুরক্ষিত বিকল্প: নতুন সিকোয়েন্স কলাম
ALTER TABLE DemoTable1955 ADD SeqNum INT; SET @n := 0; UPDATE DemoTable1955 SET SeqNum = (@n := @n + 1) ORDER BY UserId;