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

MySQL: อัปเดตหลายแถวในคอลัมน์เดียวด้วย CASE WHEN

การอัปเดตหลายแถวเงื่อนไขต่างกันในคอลัมน์เดียวด้วย 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)