Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Cập nhật nhiều hàng trong một cột MySQL dùng CASE

Để cập nhật giá trị khác nhau cho nhiều hàng trong cùng một cột trong một câu lệnh UPDATE, dùng biểu thức CASE.

Ví dụ minh họa

Tạo bảng điểm toán:

CREATE TABLE updateMultipleRowsDemo (
    StudentId INT,
    StudentMathScore INT
);

INSERT INTO updateMultipleRowsDemo VALUES (10001, 67);
INSERT INTO updateMultipleRowsDemo VALUES (10002, 69);
INSERT INTO updateMultipleRowsDemo VALUES (10003, 89);
INSERT INTO updateMultipleRowsDemo VALUES (10004, 99);
INSERT INTO updateMultipleRowsDemo VALUES (10005, 92);

Dữ liệu ban đầu:

+-----------+------------------+
| StudentId | StudentMathScore |
+-----------+------------------+
| 10001     | 67               |
| 10002     | 69               |
| 10003     | 89               |
| 10004     | 99               |
| 10005     | 92               |
+-----------+------------------+

Cập nhật điểm cho 3 học sinh đầu (ID 10001-10003) với giá trị khác nhau:

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;

Kết quả:

+-----------+------------------+
| StudentId | StudentMathScore |
+-----------+------------------+
| 10001     | 45               |
| 10002     | 52               |
| 10003     | 67               |
| 10004     | 99               |
| 10005     | 92               |
+-----------+------------------+

Giải thích:

  • CASE StudentId WHEN ... THEN ... END ánh xạ từng ID sang giá trị mới.
  • WHERE StudentId BETWEEN ... giới hạn phạm vi cập nhật (tăng hiệu năng, tránh cập nhật nhầm hàng khác).
  • Nếu không có ELSE, các hàng không khớp điều kiện WHEN sẽ được set thành NULL (trong MySQL strict mode có thể báo lỗi). Nên thêm ELSE StudentMathScore để giữ nguyên giá trị cũ cho an toàn.

Cải tiến an toàn:

UPDATE updateMultipleRowsDemo
SET StudentMathScore = CASE StudentId
    WHEN 10001 THEN 45
    WHEN 10002 THEN 52
    WHEN 10003 THEN 67
    ELSE StudentMathScore -- giữ nguyên nếu không khớp
END
WHERE StudentId IN (10001, 10002, 10003);