Giải pháp: UPDATE với phép toán số học
MySQL cho phép dùng biểu thức toán học trực tiếp trong clause SET.
Ví dụ minh họa
Tạo bảng và dữ liệu
mysql> CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Score INT
);
mysql> INSERT INTO DemoTable(Score) VALUES(67), (78), (90), (56);
Dữ liệu gốc
+----+-------+ | Id | Score | +----+-------+ | 1 | 67 | | 2 | 78 | | 3 | 90 | | 4 | 56 | +----+-------+
Giảm Score 10 cho Id = 3
mysql> UPDATE DemoTable
-> SET Score = Score - 10
-> WHERE Id = 3;
Kết quả
+----+-------+ | Id | Score | +----+-------+ | 1 | 67 | | 2 | 78 | | 3 | 80 | <-- 90 - 10 = 80 | 4 | 56 | +----+-------+
Các phép toán trong UPDATE
| Phép toán | Ví dụ | Kết quả (Score=90) |
|---|---|---|
| Cộng | SET Score = Score + 10 | 100 |
| Trừ | SET Score = Score - 10 | 80 |
| Nhân | SET Score = Score * 1.1 | 99 |
| Chia | SET Score = Score / 2 | 45 |
| Modulo | SET Score = Score % 7 | 6 |
UPDATE nhiều dòng cùng lúc
-- Giảm 10 cho Score > 80
UPDATE DemoTable SET Score = Score - 10 WHERE Score > 80;
-- Tăng 5% cho tất cả
UPDATE DemoTable SET Score = Score * 1.05;
-- CASE điều kiện
UPDATE DemoTable
SET Score = CASE
WHEN Score < 60 THEN Score + 10
WHEN Score BETWEEN 60 AND 80 THEN Score + 5
ELSE Score
END;
Lưu ý an toàn
- Luôn có WHERE (trừ khi muốn update tất cả)
- Test với SELECT trước:
SELECT Id, Score, Score - 10 AS new_score FROM DemoTable WHERE Id = 3;
- Transaction cho cập nhật quan trọng:
START TRANSACTION; UPDATE ...; -- Kiểm tra COMMIT; -- hoặc ROLLBACK;
- Backup trước khi UPDATE hàng loạt
Trả về dòng đã update (MySQL 8.0.20+)
UPDATE DemoTable SET Score = Score - 10 WHERE Id = 3 RETURNING Id, Score;