MySQL में एकल INSERT स्टेटमेंट में एकाधिक पंक्तियां डालते समय, यदि कोई पंक्ति UNIQUE कंस्ट्रेंट का उल्लंघन करती है, तो पूरा स्टेटमेंट विफल होता है और कोई पंक्ति नहीं डलती (डिफ़ॉल्ट व्यवहार)।
उदाहरण
1. यूनिक कंस्ट्रेंट के साथ टेबल
mysql> CREATE TABLE DemoTable1585 (
-> StudentId INT,
-> StudentMarks INT,
-> UNIQUE(StudentId)
-> );
2. बहु-पंक्ति INSERT (चौथी पंक्ति डुप्लिकेट)
mysql> INSERT INTO DemoTable1585 VALUES(1, 87), (2, 98), (3, 91), (3, 48); ERROR 1062 (23000): Duplicate entry '3' for key 'StudentId'
3. परिणाम: टेबल खाली
mysql> SELECT * FROM DemoTable1585; Empty set (0.00 sec)
क्यों?
MySQL डिफ़ॉल्ट रूप से INSERT को एटॉमिक ऑपरेशन के रूप में मानता है: या तो सभी पंक्तियां सफलतापूर्वक डलती हैं, या कोई नहीं (रोलबैक)।
विकल्प: आंशिक सम्मिलन
1. INSERT IGNORE (डुप्लिकेट छोड़ें)
mysql> INSERT IGNORE INTO DemoTable1585 VALUES(1, 87), (2, 98), (3, 91), (3, 48); Query OK, 3 rows affected, 1 warning -- पहले 3 डले, चौथा नजरअंदाज
2. ON DUPLICATE KEY UPDATE (अपडेट करें)
mysql> INSERT INTO DemoTable1585 VALUES(1, 87), (2, 98), (3, 91), (3, 48)
-> ON DUPLICATE KEY UPDATE StudentMarks = VALUES(StudentMarks);
-- चौथी पंक्ति से StudentId=3 का StudentMarks 48 हो जाएगा
3. REPLACE INTO (हटाकर डालें)
mysql> REPLACE INTO DemoTable1585 VALUES(1, 87), (2, 98), (3, 91), (3, 48); -- मौजूदा StudentId=3 हटाकर नई पंक्ति डालेगा
तुलना
| स्टेटमेंट | डुप्लिकेट पर व्यवहार | चेतावनी |
|---|---|---|
| INSERT | पूरा विफल, रोलबैक | त्रुटि |
| INSERT IGNORE | डुप्लिकेट छोड़ें, बाकी डालें | चेतावनी |
| INSERT ... ON DUPLICATE KEY UPDATE | मौजूदा अपडेट करें | कोई नहीं |
| REPLACE INTO | पुराना हटाएं, नया डालें | कोई नहीं (लेकिन ऑटो-इन्क्रीमेंट बदल सकता है) |
सिफारिश
एप्लिकेशन आवश्यकता के अनुसार चुनें: INSERT IGNORE (लॉगिंग), ON DUPLICATE KEY UPDATE (अपसर्ट), REPLACE (पूर्ण प्रतिस्थापन)।