REPLACE INTO: ทำงานเหมือน DELETE แล้ว INSERT ในคำสั่งเดียว
REPLACE INTO ใน MySQL ทำงานโดย: หากแถวใหม่มี Primary Key หรือ Unique Key ซ้ำกับแถวเดิม → ลบแถวเก่าออก แล้ว แทรกแถวใหม่เข้าไป (ทำให้ได้ 2 rows affected)
เงื่อนไขการใช้งาน
- ตารางต้องมี PRIMARY KEY หรือ UNIQUE INDEX
- หากไม่มี Key ใดๆ REPLACE INTO จะทำงานเหมือน INSERT ธรรมดา
ตัวอย่าง: แทนที่ข้อมูลนักเรียนรหัส 100
1. สร้างตารางและสร้าง Unique Index
CREATE TABLE DemoTable (
Id INT,
FirstName VARCHAR(50)
);
ALTER TABLE DemoTable ADD UNIQUE id_index (Id);
2. เพิ่มข้อมูลด้วย REPLACE INTO
REPLACE INTO DemoTable VALUES (100, 'Chris'); -- เพิ่มใหม่
REPLACE INTO DemoTable VALUES (101, 'David'); -- เพิ่มใหม่
REPLACE INTO DemoTable VALUES (100, 'Bob'); -- Id 100 ซ้ำ! ลบเก่า แทรกใหม่
ผลลัพธ์การรันคำสั่งที่ 3: Query OK, 2 rows affected (0.16 sec) ← สังเกต: 2 rows affected (1 deleted + 1 inserted)
3. ตรวจสอบข้อมูล
SELECT * FROM DemoTable;
ผลลัพธ์:
+------+-----------+
| Id | FirstName |
+------+-----------+
| 100 | Bob |
| 101 | David |
+------+-----------+
ความแตกต่างระหว่าง REPLACE INTO, INSERT IGNORE, INSERT ... ON DUPLICATE KEY UPDATE
| คำสั่ง | พฤติกรรมเมื่อ Key ซ้ำ | Rows Affected |
|---|---|---|
REPLACE INTO | ลบแถวเก่า → แทรกแถวใหม่ (Auto-increment อาจเปลี่ยน) | 2 (1 delete + 1 insert) |
INSERT IGNORE | ข้ามการแทรก (เก็บแถวเก่าไว้) | 0 |
INSERT ... ON DUPLICATE KEY UPDATE | อัปเดตคอลัมน์ที่ระบุในแถวเก่า | 1 (update) หรือ 2 (insert) |
ตัวอย่าง INSERT ... ON DUPLICATE KEY UPDATE (แนะนำมากกว่า)
INSERT INTO DemoTable (Id, FirstName) VALUES (100, 'Bob')
ON DUPLICATE KEY UPDATE FirstName = 'Bob';
วิธีนี้:
- ไม่ลบแถวเก่า (Auto-increment ไม่เปลี่ยน)
- อัปเดตเฉพาะคอลัมน์ที่ต้องการ
- ประสิทธิภาพดีกว่า
- เป็นมาตรฐาน SQL ที่พกพาได้ (Portable)
ข้อควรระวังของ REPLACE INTO
- ทำให้
AUTO_INCREMENTกระโดด (เพราะลบแล้วแทรกใหม่) - ทำให้
FOREIGN KEY ที่อ้างอิงแถวนี้ทำงานผิด (ON DELETE CASCADE จะลบข้อมูลที่เกี่ยวข้อง) - Trigger: จะยิง
BEFORE DELETE,AFTER DELETE,BEFORE INSERT,AFTER INSERTทั้งคู่