MySQL में ON DUPLICATE KEY UPDATE का सही उपयोग
INSERT ... ON DUPLICATE KEY UPDATE MySQL का एक शक्तिशाली एक्सटेंशन है जो डुप्लिकेट कुंजी संघर्ष होने पर मौजूदा पंक्ति को अपडेट करने की अनुमति देता है। इसे "अपसर्ट" (UPSERT - UPDATE + INSERT) भी कहा जाता है।
सिंटैक्स
INSERT INTO yourTableName VALUES (yourValue1, yourValue2, ...)
ON DUPLICATE KEY UPDATE
yourColumnName1 = yourValue1,
yourColumnName2 = yourValue2, ...;
टेबल बनाना (UNIQUE KEY के साथ)
mysql> CREATE TABLE DemoTable1539 (
-> EmployeeName VARCHAR(20),
-> EmployeeSalary INT,
-> UNIQUE KEY(EmployeeName)
-> );
Query OK, 0 rows affected (0.62 sec)
महत्वपूर्ण: UNIQUE KEY या PRIMARY KEY आवश्यक है
ON DUPLICATE KEY UPDATE काम करने के लिए, टेबल में एक PRIMARY KEY या UNIQUE INDEX होना चाहिए जो डुप्लिकेट का पता लगा सके।
डेटा डालना और अपडेट करना
-- पहली बार डालना - नई पंक्ति बनती है
mysql> INSERT INTO DemoTable1539 VALUES ('Chris',4500)
-> ON DUPLICATE KEY UPDATE EmployeeName='Robert', EmployeeSalary=8500;
Query OK, 1 row affected (0.20 sec)
-- दूसरी पंक्ति डालना - नई पंक्ति बनती है
mysql> INSERT INTO DemoTable1539 VALUES ('David',5500)
-> ON DUPLICATE KEY UPDATE EmployeeName='Robert', EmployeeSalary=8500;
Query OK, 1 row affected (0.10 sec)
-- डुप्लिकेट कुंजी डालना - मौजूदा पंक्ति अपडेट होती है
mysql> INSERT INTO DemoTable1539 VALUES ('Chris',4500)
-> ON DUPLICATE KEY UPDATE EmployeeName='Robert', EmployeeSalary=8500;
Query OK, 2 rows affected (0.14 sec)
नोट: "2 rows affected" का अर्थ
- 1 row affected = नई पंक्ति डाली गई
- 2 rows affected = मौजूदा पंक्ति अपडेट की गई
अंतिम परिणाम
mysql> SELECT * FROM DemoTable1539;
+--------------+----------------+
| EmployeeName | EmployeeSalary |
+--------------+----------------+
| Robert | 8500 |
| David | 5500 |
+--------------+----------------+
2 rows in set (0.00 sec)
व्याख्या
- पहला INSERT: 'Chris' नया है → डाला गया (1 row affected)
- दूसरा INSERT: 'David' नया है → डाला गया (1 row affected)
- तीसरा INSERT: 'Chris' पहले से मौजूद है → अपडेट किया गया: नाम 'Robert' और वेतन 8500 में बदला (2 rows affected)
VALUES() फ़ंक्शन का उपयोग (बेहतर तरीका)
INSERT INTO DemoTable1539 (EmployeeName, EmployeeSalary)
VALUES ('Chris', 4500)
ON DUPLICATE KEY UPDATE
EmployeeSalary = VALUES(EmployeeSalary); -- डाले गए मान का उपयोग करता है
व्यावहारिक उपयोग मामले
- काउंटर बढ़ाना:
UPDATE count = count + 1 - अंतिम अद्यतन समयस्टैम्प सेट करना:
UPDATE last_modified = NOW() - शर्तों के आधार पर आंशिक अपडेट
सावधानियां
- एकाधिक UNIQUE KEYS होने पर व्यवहार जटिल हो सकता है
- AUTO_INCREMENT मान अपडेट पर भी बढ़ सकता है
- ट्रिगर दोनों INSERT और UPDATE के लिए फायर होते हैं