รวมการ Insert และ Update ด้วย ON DUPLICATE KEY UPDATE
MySQL รองรับการ Insert ข้อมูลใหม่ และ Update ข้อมูลเดิม ในคำสั่งเดียวกันผ่าน ON DUPLICATE KEY UPDATE ซึ่งทำงานเมื่อพบ **Primary Key** หรือ **Unique Key** ซ้ำ
Syntax
INSERT INTO table_name (col1, col2, ...) VALUES (val1, val2, ...) ON DUPLICATE KEY UPDATE col2 = new_value, ...;
ตัวอย่างการใช้งาน
สร้างตารางที่มี Primary Key:
mysql> CREATE TABLE DemoTable (
Id INT NOT NULL PRIMARY KEY,
Number INT
);
Query OK, 0 rows affected (0.83 sec)
ทดสอบ Insert ครั้งแรก (ข้อมูลใหม่):
mysql> INSERT INTO DemoTable VALUES (1, 190) ON DUPLICATE KEY UPDATE Number = Number + 10; Query OK, 1 row affected (0.19 sec) mysql> INSERT INTO DemoTable VALUES (2, 130) ON DUPLICATE KEY UPDATE Number = Number + 10; Query OK, 1 row affected (0.19 sec)
ทดสอบ Insert ซ้ำ (Primary Key 1 และ 2 ซ้ำ) -> จะทำ Update แทน:
mysql> INSERT INTO DemoTable VALUES (1, 190) ON DUPLICATE KEY UPDATE Number = Number + 10; Query OK, 2 rows affected (0.14 sec) -- 2 rows = 1 insert attempt + 1 update mysql> INSERT INTO DemoTable VALUES (2, 130) ON DUPLICATE KEY UPDATE Number = Number + 10; Query OK, 2 rows affected (0.17 sec)
ตรวจสอบผลลัพธ์ - ค่า Number เพิ่มขึ้น 10 จากค่าเดิม:
mysql> SELECT * FROM DemoTable;
+----+--------+ | Id | Number | +----+--------+ | 1 | 200 | -- 190 + 10 | 2 | 140 | -- 130 + 10 +----+--------+ 2 rows in set (0.00 sec)
จุดสำคัญ
- ต้องมี **Primary Key** หรือ **Unique Index** ถึงจะทำงาน
VALUES()ในส่วน UPDATE หมายถึงค่าที่พยายาม Insert เข้าไป (ไม่ใช่ค่าเดิมในตาราง)- คืนค่า
1 row affected= Insert ใหม่,2 rows affected= Update ข้อมูลเดิม - เหมาะสำหรับ Upsert (Update + Insert) และนับจำนวน/สะสมค่า