Cập nhật cộng dồn giá trị vào cột số với UPDATE SET col = col + value
Trong MySQL, có thể tham chiếu chính cột đó trong vế phải của SET: SET Score = Score + 21. MySQL dùng giá trị cũ để tính, gán giá trị mới.
1. Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentScore INT
);
mysql> INSERT INTO DemoTable (StudentScore) VALUES (78), (89), (67), (95);
2. Xem dữ liệu ban đầu
mysql> SELECT * FROM DemoTable;
+-----------+--------------+ | StudentId | StudentScore | +-----------+--------------+ | 1 | 78 | | 2 | 89 | | 3 | 67 | | 4 | 95 | +-----------+--------------+
3. Truy vấn: Cộng 21 vào StudentScore của StudentId = 3
mysql> UPDATE DemoTable
SET StudentScore = StudentScore + 21
WHERE StudentId = 3;
Kết quả: Query OK, 1 row affected ... Changed: 1
4. Kiểm tra kết quả
mysql> SELECT * FROM DemoTable;
+-----------+--------------+ | StudentId | StudentScore | +-----------+--------------+ | 1 | 78 | | 2 | 89 | | 3 | 88 | ← 67 + 21 = 88 | 4 | 95 | +-----------+--------------+
Giải thích:
- MySQL đọc giá trị cũ (67), tính 67+21=88, ghi đè
- Không cần SELECT trước để biết giá trị hiện tại
- Tự động xử lý race condition trong single statement (atomic)
Mở rộng - Cộng cho nhiều hàng:
-- Cộng 10 cho tất cả
UPDATE DemoTable SET StudentScore = StudentScore + 10;
-- Cộng khác nhau theo điều kiện
UPDATE DemoTable
SET StudentScore = StudentScore + CASE
WHEN StudentScore < 80 THEN 20
WHEN StudentScore < 90 THEN 10
ELSE 5
END;
Ứng dụng: Tăng lương, cộng điểm, trừ tồn kho, cập nhật counter, v.v.
Lưu ý đồng thời (concurrency): Single UPDATE là atomic. Nhưng nếu logic phức tạp (SELECT rồi UPDATE riêng), cần transaction + row lock (SELECT ... FOR UPDATE).