Cú pháp đơn giản
UPDATE bang SET cot = cot + 1 WHERE dieu_kien;
Ví dụ: Cộng 1 cho các giá trị >= 20
Dữ liệu ban đầu
+-------+ | Value | +-------+ | 10 | | 13 | | 15 | | 16 | | 20 | | 40 | | 50 | | 55 | | 56 | +-------+
Truy vấn
mysql> UPDATE Add1ToExistingValue SET Value = Value + 1 WHERE Value >= 20;
Kết quả
+-------+ | Value | +-------+ | 10 | | 13 | | 15 | | 16 | | 21 | -- 20+1 | 41 | -- 40+1 | 51 | -- 50+1 | 56 | -- 55+1 | 57 | -- 56+1 +-------+
Các biến thể
- Cộng hằng số khác:
cot = cot + 5 - Cộng giá trị cột khác:
cot1 = cot1 + cot2 - Tăng dần theo thứ tự: Dùng biến
@seq := @seq + 1(xem bài 1003073308) - Cộng có điều kiện phức tạp:
cot = cot + CASE WHEN ... THEN 1 ELSE 0 END
Atomic increment (đồng thời an toàn)
UPDATE đơn lẻ trong MySQL là atomic. Tuy nhiên, nếu đọc rồi ghi (SELECT ... UPDATE) cần transaction:
START TRANSACTION; SELECT Value FROM bang WHERE id=1 FOR UPDATE; UPDATE bang SET Value = Value + 1 WHERE id=1; COMMIT;
Generated Column (MySQL 5.7+)
ALTER TABLE bang ADD COLUMN value_plus_1 INT GENERATED ALWAYS AS (Value + 1) VIRTUAL;
Mẹo: Dùng Value = Value + 1 thay vì đọc ra tính toán rồi update - hiệu năng tốt hơn, tránh race condition.