MySQL में INSERT ... ON DUPLICATE KEY UPDATE स्टेटमेंट का उपयोग करके, यदि रिकॉर्ड पहले से मौजूद है (डुप्लिकेट प्राइमरी की या यूनिक की), तो नया रिकॉर्ड डालने के बजाय मौजूदा रिकॉर्ड को अपडेट करें।
सिंटैक्स
INSERT INTO table_name (col1, col2, ...) VALUES (val1, val2, ...)
ON DUPLICATE KEY UPDATE col1 = new_val1, col2 = new_val2, ...;
व्यावहारिक उदाहरण
1. यूनिक की के साथ टेबल बनाएं
mysql> CREATE TABLE DemoTable733 (
StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentName VARCHAR(100),
StudentMarks INT,
UNIQUE KEY Un_Name (StudentName)
);
Query OK, 0 rows affected (0.60 sec)
2. रिकॉर्ड्स डालें/अपडेट करें
mysql> INSERT INTO DemoTable733 (StudentName, StudentMarks) VALUES ('John', 45) ON DUPLICATE KEY UPDATE StudentMarks = 86;
Query OK, 1 row affected (0.19 sec) -- नया रिकॉर्ड
mysql> INSERT INTO DemoTable733 (StudentName, StudentMarks) VALUES ('Adam', 65) ON DUPLICATE KEY UPDATE StudentMarks = 86;
Query OK, 1 row affected (0.15 sec) -- नया रिकॉर्ड
mysql> INSERT INTO DemoTable733 (StudentName, StudentMarks) VALUES ('Carol', 75) ON DUPLICATE KEY UPDATE StudentMarks = 86;
Query OK, 1 row affected (0.08 sec) -- नया रिकॉर्ड
mysql> INSERT INTO DemoTable733 (StudentName, StudentMarks) VALUES ('John', 45) ON DUPLICATE KEY UPDATE StudentMarks = 86;
Query OK, 2 rows affected (0.12 sec) -- डुप्लिकेट! अपडेट हुआ (2 rows affected दर्शाता है)
3. परिणाम देखें
mysql> SELECT * FROM DemoTable733;
+-----------+-------------+--------------+
| StudentId | StudentName | StudentMarks |
+-----------+-------------+--------------+
| 1 | John | 86 | -- अपडेट हुआ (45 → 86)
| 2 | Adam | 65 | -- नया, अपडेट नहीं हुआ
| 3 | Carol | 75 | -- नया, अपडेट नहीं हुआ
+-----------+-------------+--------------+
3 rows in set (0.00 sec)
प्रभावित पंक्ति संख्या अर्थ
| मान | अर्थ |
| 1 | नया रिकॉर्ड डाला गया |
| 2 | मौजूदा रिकॉर्ड अपडेट किया गया |
| 0 | कोई बदलाव नहीं (मान समान) |
VALUES() फ़ंक्शन का उपयोग
INSERT INTO DemoTable733 (StudentName, StudentMarks) VALUES ('John', 90)
ON DUPLICATE KEY UPDATE StudentMarks = VALUES(StudentMarks);
-- डालने वाले मान (90) से अपडेट करता है, हार्डकोडेड 86 के बजाय
एकाधिक कॉलम्स अपडेट
INSERT INTO DemoTable733 (StudentName, StudentMarks) VALUES ('John', 95)
ON DUPLICATE KEY UPDATE
StudentMarks = VALUES(StudentMarks),
LastUpdated = CURRENT_TIMESTAMP;
REPLACE INTO vs ON DUPLICATE KEY UPDATE
| REPLACE INTO | ON DUPLICATE KEY UPDATE |
| पुरानी पंक्ति हटाता है, नई डालता है | मौजूदा पंक्ति अपडेट करता है |
| ऑटो-इन्क्रीमेंट आईडी बदल सकती है | आईडी अपरिवर्तित रहती है |
| सभी कॉलम्स निर्दिष्ट करने पड़ते हैं | चुनिंदा कॉलम्स अपडेट कर सकते हैं |
| ट्रिगर: DELETE फिर INSERT | ट्रिगर: UPDATE |
आवश्यक शर्तें
- टेबल में PRIMARY KEY या UNIQUE INDEX होना चाहिए
- डुप्लिकेट चेक इन कंस्ट्रेंट्स पर आधारित है
- यदि कोई यूनिक कंस्ट्रेंट नहीं, तो हमेशा INSERT होगा