UPDATE ค่าเฉพาะแถวที่ตรงเงื่อนไข
ใช้ UPDATE ... SET ... WHERE เพื่อเปลี่ยนค่าในคอลัมน์เฉพาะแถวที่ต้องการ ไม่ใช่ Swap ระหว่างสองแถว (ซึ่งซับซ้อนกว่า)
สร้างตารางและข้อมูล
mysql> CREATE TABLE DemoTable1504 (
-> Id INT,
-> FirstName VARCHAR(20)
-> );
Query OK, 0 rows affected (0.83 sec)
mysql> INSERT INTO DemoTable1504 VALUES
-> (101, 'Chris'), (102, 'Bob'), (103, 'David'), (104, 'Mike');
Query OK, 4 rows affected
ข้อมูลก่อนแก้ไข
+------+-----------+ | Id | FirstName | +------+-----------+ | 101 | Chris | | 102 | Bob | | 103 | David | | 104 | Mike | +------+-----------+
คำสั่ง: เปลี่ยน FirstName ของ Id=103 จาก David เป็น Carol
mysql> UPDATE DemoTable1504
-> SET FirstName = 'Carol'
-> WHERE Id = 103 AND FirstName <> 'Carol';
Query OK, 1 row affected (0.13 sec)
Rows matched: 1 Changed: 1 Warnings: 0
ข้อมูลหลังแก้ไข
+------+-----------+ | Id | FirstName | +------+-----------+ | 101 | Chris | | 102 | Bob | | 103 | Carol | | 104 | Mike | +------+-----------+
คำอธิบายเงื่อนไข WHERE
Id = 103- ระบุแถวเป้าหมายโดย Primary Key/Unique Key (Best Practice)AND FirstName <> 'Carol'- ป้องกันการ UPDATE ซ้ำ (Idempotent) ถ้ารันหลายครั้งRows matched: 1 Changed: 0
⚠️ หากต้องการ Swap ค่าระหว่าง 2 แถว (Swap จริง)
-- สมมติต้องการสลับ FirstName ของ Id=101 และ Id=102
-- วิธี 1: ใช้ Transaction (ปลอดภัย)
START TRANSACTION;
UPDATE DemoTable1504 SET FirstName = 'TEMP_SWAP' WHERE Id = 101;
UPDATE DemoTable1504 SET FirstName = (SELECT FirstName FROM DemoTable1504 WHERE Id = 101) WHERE Id = 102;
UPDATE DemoTable1504 SET FirstName = (SELECT FirstName FROM DemoTable1504 WHERE Id = 102) WHERE Id = 101;
COMMIT;
-- วิธี 2: ใช้ CASE (Single Statement)
UPDATE DemoTable1504
SET FirstName = CASE Id
WHEN 101 THEN (SELECT FirstName FROM DemoTable1504 WHERE Id = 102)
WHEN 102 THEN (SELECT FirstName FROM DemoTable1504 WHERE Id = 101)
END
WHERE Id IN (101, 102);
สรุป
- UPDATE เฉพาะแถว: ใช้ WHERE ระบุ Primary Key
- เพิ่มเงื่อนไข
AND column <> new_valueเพื่อ Idempotency - Swap จริงระหว่างแถว: ใช้ Transaction หรือ CASE WITH Subquery