MySQL में अग्रणी शून्य के साथ क्रमिक ID उत्पन्न करना
LPAD() फ़ंक्शन और INSERT INTO SELECT का उपयोग करके आप एक कॉलम में अग्रणी शून्य के साथ स्वरूपित मान (जैसे '001', '002', '003') स्वचालित रूप से उत्पन्न और डाल सकते हैं।
टेबल बनाना
mysql> CREATE TABLE DemoTable1967 (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> UserId VARCHAR(20)
-> );
Query OK, 0 rows affected (0.00 sec)
LPAD के साथ INSERT INTO SELECT का उपयोग करके डेटा डालना
mysql> INSERT INTO DemoTable1967(UserId)
-> SELECT LPAD(COALESCE(MAX(Id), 0) + 1, 3, '0') FROM DemoTable1967;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> INSERT INTO DemoTable1967(UserId)
-> SELECT LPAD(COALESCE(MAX(Id), 0) + 1, 3, '0') FROM DemoTable1967;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> INSERT INTO DemoTable1967(UserId)
-> SELECT LPAD(COALESCE(MAX(Id), 0) + 1, 3, '0') FROM DemoTable1967;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
परिणाम
mysql> SELECT * FROM DemoTable1967;
+----+--------+
| Id | UserId |
+----+--------+
| 1 | 001 |
| 2 | 002 |
| 3 | 003 |
+----+--------+
3 rows in set (0.00 sec)
फ़ंक्शन विश्लेषण
MAX(Id): वर्तमान अधिकतम ID प्राप्त करता हैCOALESCE(MAX(Id), 0): यदि टेबल खाली है तो 0 लौटाता है (पहली पंक्ति के लिए)+ 1: अगला क्रमिक संख्याLPAD(value, 3, '0'): मान को बाईं ओर '0' से पैड करके 3 वर्णों का बनाता है
LPAD सिंटैक्स
LPAD(str, len, padstr)
- str: पैड करने के लिए स्ट्रिंग
- len: परिणाम की कुल लंबाई
- padstr: पैड करने के लिए स्ट्रिंग (दोहराई जाती है)
LPAD उदाहरण
SELECT LPAD(1, 3, '0'); -- '001'
SELECT LPAD(12, 3, '0'); -- '012'
SELECT LPAD(123, 3, '0'); -- '123'
SELECT LPAD(1234, 3, '0'); -- '1234' (काटा नहीं जाता, लंबाई से अधिक)
RPAD (दाएं पैडिंग)
SELECT RPAD(1, 3, '0'); -- '100'
SELECT RPAD('AB', 5, 'x'); -- 'ABxxx'
संभावित समस्याएं और समाधान
1. रेस कंडीशन (समवर्ती इन्सर्ट)
उच्च समवर्ती वातावरण में, दो सत्र समान MAX(Id) पढ़ सकते हैं।
समाधान: लेनदेन या LOCK TABLES का उपयोग करें, या AUTO_INCREMENT पर भरोसा करें और दृश्य/गणना कॉलम में प्रारूपित करें।
2. बेहतर दृष्टिकोण: दृश्य/गणना कॉलम
-- MySQL 5.7+ गणना कॉलम
ALTER TABLE DemoTable1967
ADD COLUMN FormattedId VARCHAR(10)
GENERATED ALWAYS AS (LPAD(Id, 3, '0')) STORED;
-- या दृश्य
CREATE VIEW View_DemoTable1967 AS
SELECT Id, LPAD(Id, 3, '0') AS UserId FROM DemoTable1967;
3. ट्रिगर-आधारित दृष्टिकोण
CREATE TRIGGER before_insert_demo
BEFORE INSERT ON DemoTable1967
FOR EACH ROW
SET NEW.UserId = LPAD(NEW.Id, 3, '0');
प्रदर्शन नोट
प्रत्येक INSERT पर SELECT MAX(Id) के लिए टेबल स्कैन की आवश्यकता होती है। बड़े टेबल्स के लिए, एक काउंटर टेबल या अनुक्रम का उपयोग करें (MySQL 8.0+: CREATE SEQUENCE)।