Để 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ệnWHENsẽ được set thànhNULL(trong MySQL strict mode có thể báo lỗi). Nên thêmELSE 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);