Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

เทคนิค INSERT ON DUPLICATE KEY UPDATE สำหรับจัดการข้อมูลซ้ำใน MySQL


ปัญหาข้อมูลซ้ำและวิธีแก้ไข

เมื่อต้องการแทรกข้อมูลใหม่แต่ไม่ต้องการให้เกิดข้อผิดพลาดหากข้อมูลซ้ำ (duplicate key) สามารถใช้คำสั่ง INSERT ... ON DUPLICATE KEY UPDATE ซึ่งจะทำงานดังนี้:

  • หากไม่มีข้อมูลซ้ำ → ทำการ INSERT ตามปกติ
  • หากมีข้อมูลซ้ำ (ตาม Unique Key หรือ Primary Key) → ทำการ UPDATE ข้อมูลเดิมแทน

ตัวอย่างการใช้งาน

1. สร้างตารางพร้อม Unique Constraint

mysql> CREATE TABLE DemoTable (
    -> Id INT,
    -> Name VARCHAR(20),
    -> UNIQUE(Id, Name)
    -> );
Query OK, 0 rows affected (0.78 sec)

2. แทรกข้อมูลพร้อมจัดการข้อมูลซ้ำ

mysql> INSERT INTO DemoTable VALUES(101, 'Chris') ON DUPLICATE KEY UPDATE Id=10001, Name='Robert';
Query OK, 1 row affected (0.23 sec)
mysql> INSERT INTO DemoTable VALUES(102, 'Mike') ON DUPLICATE KEY UPDATE Id=10001, Name='Robert';
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO DemoTable VALUES(101, 'Chris') ON DUPLICATE KEY UPDATE Id=10001, Name='Robert';
Query OK, 2 rows affected (0.10 sec)

หมายเหตุ: คำสั่งที่ 3 พบข้อมูลซ้ำ (Id=101, Name='Chris') จึงทำการ UPDATE แทน ทำให้ได้ 2 rows affected

3. ตรวจสอบข้อมูลในตาราง

mysql> SELECT * FROM DemoTable;

ผลลัพธ์:

+-------+--------+
| Id    | Name   |
+-------+--------+
| 102   | Mike   |
| 10001 | Robert |
+-------+--------+
2 rows in set (0.00 sec)

ข้อดีของวิธีนี้

  • ป้องกัน Error 1062 (Duplicate entry) ได้อย่างมีประสิทธิภาพ
  • ลดความซับซ้อนของโค้ด ไม่ต้องตรวจสอบก่อน Insert
  • เหมาะสำหรับระบบที่ต้องการ Upsert (Update + Insert)
  • ทำงานได้แบบ Atomic (ทั้งสำเร็จหรือล้มเหลวพร้อมกัน)

กรณีการใช้งานทั่วไป

  • นับจำนวนการเข้าชม (Page views counter)
  • อัปเดตข้อมูลผู้ใช้ล่าสุด (Last login, profile update)
  • จัดการ Inventory/Stok ที่อาจมีการเพิ่ม/ลดซ้ำกัน