การอัปเดตหลายแถวเงื่อนไขต่างกันในคอลัมน์เดียวด้วย CASE
เมื่อต้องการอัปเดตค่าในคอลัมน์เดียวกันแต่ให้ค่าต่างกันไปตามเงื่อนไข (เช่น ID 10001 → 45, ID 10002 → 52) ให้ใช้ CASE WHEN ... THEN ... END ภายในคำสั่ง UPDATE ... SET ทำได้ใน Query เดียว
ตัวอย่างการใช้งาน
สร้างตารางคะแนนนักเรียน:
mysql> CREATE TABLE updateMultipleRowsDemo (
-> StudentId INT,
-> StudentMathScore INT
-> );
Query OK, 0 rows affected (0.63 sec)
mysql> INSERT INTO updateMultipleRowsDemo VALUES(10001, 67);
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO updateMultipleRowsDemo VALUES(10002, 69);
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO updateMultipleRowsDemo VALUES(10003, 89);
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO updateMultipleRowsDemo VALUES(10004, 99);
Query OK, 1 row affected (0.13 sec)
mysql> INSERT INTO updateMultipleRowsDemo VALUES(10005, 92);
Query OK, 1 row affected (0.13 sec)
ข้อมูลก่อนอัปเดต:
mysql> SELECT * FROM updateMultipleRowsDemo;
+-----------+------------------+
| StudentId | StudentMathScore |
+-----------+------------------+
| 10001 | 67 |
| 10002 | 69 |
| 10003 | 89 |
| 10004 | 99 |
| 10005 | 92 |
+-----------+------------------+
5 rows in set (0.00 sec)
อัปเดตคะแนนสำหรับ ID 10001-10003 ต่างกัน:
mysql> UPDATE updateMultipleRowsDemo
-> SET StudentMathScore = CASE StudentId
-> WHEN 10001 THEN 45
-> WHEN 10002 THEN 52
-> WHEN 10003 THEN 67
-> END
-> WHERE StudentId BETWEEN 10001 AND 10003;
Query OK, 3 rows affected (0.19 sec)
Rows matched: 3 Changed: 3 Warnings: 0
ผลลัพธ์หลังอัปเดต:
mysql> SELECT * FROM updateMultipleRowsDemo;
+-----------+------------------+
| StudentId | StudentMathScore |
+-----------+------------------+
| 10001 | 45 |
| 10002 | 52 |
| 10003 | 67 |
| 10004 | 99 |
| 10005 | 92 |
+-----------+------------------+
5 rows in set (0.00 sec)
คำอธิบายและรูปแบบอื่น
รูปแบบ Searched CASE (ยืดหยุ่นกว่า):
UPDATE table_name
SET column = CASE
WHEN condition1 THEN value1
WHEN condition2 THEN value2
ELSE column -- ไม่เปลี่ยนแปลงหรือกำหนดค่า default
END
WHERE ...;
ตัวอย่าง: WHEN StudentId = 10001 THEN 45 WHEN StudentId = 10002 THEN 52 ...
ข้อดีของวิธีนี้
- รัน Query เดียว ลด Round-trip ไป Database
- Atomic: สำเร็จทั้งหมดหรือล้มเหลวทั้งหมด (Transaction)
- หลีกเลี่ยง Race Condition จากการ UPDATE หลายครั้ง
ข้อควรระวัง: ต้องมี WHERE จำกัดขอบเขต ไม่งั้นจะอัปเดตทุกแถว (แถวที่ไม่ match CASE จะได้ NULL หากไม่มี ELSE)