ปัญหาข้อมูลซ้ำและวิธีแก้ไข
เมื่อต้องการแทรกข้อมูลใหม่แต่ไม่ต้องการให้เกิดข้อผิดพลาดหากข้อมูลซ้ำ (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 ที่อาจมีการเพิ่ม/ลดซ้ำกัน