Vấn đề: UPDATE cột với giá trị mới phụ thuộc vào giá trị cũ (đổi chỗ)
Cần hoán đổi giá trị: Marks = 45 → 98, Marks = 98 → 0.
Giải pháp: UPDATE với CASE trong mệnh đề SET
Biểu thức CASE trong SET cho phép gán giá trị khác nhau tùy theo giá trị hiện tại.
1. Tạo bảng và dữ liệu
CREATE TABLE DemoTable (
StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentName VARCHAR(20),
StudentMarks INT
);
INSERT INTO DemoTable (StudentName, StudentMarks) VALUES
('Chris', 98), ('David', 45);
2. Cập nhật với CASE
UPDATE DemoTable
SET StudentMarks = CASE StudentMarks
WHEN 45 THEN 98
WHEN 98 THEN 0
END
WHERE StudentMarks IN (45, 98);
3. Kết quả (đã hoán đổi)
+-----------+-------------+--------------+
| StudentId | StudentName | StudentMarks |
+-----------+-------------+--------------+
| 1 | Chris | 0 |
| 2 | David | 98 |
+-----------+-------------+--------------+
Giải thích
CASE StudentMarks WHEN 45 THEN 98 WHEN 98 THEN 0 END– Dạng "simple CASE": so sánhStudentMarksvới các giá trị liệt kê.WHERE StudentMarks IN (45, 98)– Giới hạn chỉ cập nhật các hàng liên quan, tránh quét toàn bảng.- Nếu không khớp điều kiện CASE nào, giá trị giữ nguyên (hoặc NULL nếu không có ELSE).
Cảnh báo: Không dùng SET col = CASE ... cho hoán đổi trực tiếp hai cột
Sai: UPDATE t SET a = b, b = a; (cả hai dùng giá trị cũ).
Đúng: UPDATE t SET a = b, b = a WHERE ... MySQL đánh giá vế phải trước, sau đó gán – nên a nhận giá trị cũ của b, b nhận giá trị cũ của a? Thực tế MySQL đánh giá từng biểu thức theo thứ tự? Không đảm bảo. An toàn nhất dùng biến tạm hoặc CASE như trên.