AUTO_INCREMENT ছাড়া নিজে থেকে প্যাডেড আইডি (যেমন 001, 002) জেনারেট করতে LPAD(), COALESCE() এবং MAX() ফাংশন কম্বাইন করে INSERT INTO SELECT ব্যবহার করা হয়।
টেবিল তৈরি
mysql> CREATE TABLE DemoTable1967 (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
UserId VARCHAR(20)
);
INSERT INTO SELECT দিয়ে প্যাডেড আইডি ইনসার্ট
mysql> INSERT INTO DemoTable1967 (UserId)
SELECT LPAD(COALESCE(MAX(Id), 0) + 1, 3, '0') FROM DemoTable1967;
mysql> INSERT INTO DemoTable1967 (UserId)
SELECT LPAD(COALESCE(MAX(Id), 0) + 1, 3, '0') FROM DemoTable1967;
mysql> INSERT INTO DemoTable1967 (UserId)
SELECT LPAD(COALESCE(MAX(Id), 0) + 1, 3, '0') FROM DemoTable1967;
ফাংশন ব্যাখ্যা:
MAX(Id)— বর্তমান সর্বোচ্চ আইডি।COALESCE(MAX(Id), 0)— টেবিল খালি থাকলে ০ রিটার্ন (NULL এড়াতে)।+ 1— পরবর্তী সিকোয়েন্স নম্বর।LPAD(..., 3, '0')— ৩ অঙ্কে বামে ০ প্যাড করে (১ → '001')।
ফলাফল যাচাই
mysql> SELECT * FROM DemoTable1967;
+----+--------+ | Id | UserId | +----+--------+ | 1 | 001 | | 2 | 002 | | 3 | 003 | +----+--------+
সতর্কতা: কানকারেন্সি সমস্যা
এই পদ্ধতি **নন-অ্যাটমিক**। একই সময় دوজন ইউজার ইনসার্ট করলে ডুপ্লিকেট UserId তৈরি হতে পারে (রেস কন্ডিশন)।
সুরক্ষিত বিকল্পসমূহ
- AUTO_INCREMENT + ZEROFILL (আর্টিকেল ১০০৬০৭৫৪৯৯ দেখুন) — নেটিভ, থ্রেড-সেফ।
- সিকোয়েন্স টেবিল + ট্রানজ্যাকশন:
START TRANSACTION; UPDATE seq_table SET val = LAST_INSERT_ID(val + 1); INSERT INTO main_table (id, ...) VALUES (LAST_INSERT_ID(), ...); COMMIT; - UUID() / ULID() — ডিস্ট্রিবিউটেড সিস্টেমের জন্য।
পারফরম্যান্স নোট
MAX(Id) প্রতিবার ফুল টেবিল স্ক্যান করতে পারে (ইন্ডেক্স থাকলে দ্রুত)। বড় টেবিলে ডেডিকেটেড সিকোয়েন্স টেবিল ভালো।