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

การใช้ REPLACE INTO ใน MySQL เพื่อแทนที่ DELETE + INSERT

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 ทั้งคู่

สรุป: ควรใช้ ON DUPLICATE KEY UPDATE แทน REPLACE INTO ในกรณีส่วนใหญ่