Cú pháp cơ bản
Sử dụng UPDATE với phép trừ trực tiếp trên cột:
UPDATE ten_bang SET ten_cot = ten_cot - 1 WHERE dieu_kien;
Ví dụ: Giảm UserScores cho UserId = 103
1. Tạo bảng
mysql> CREATE TABLE IncrementAndDecrementValue ( -> UserId INT, -> UserScores INT -> ); Query OK, 0 rows affected (0.60 sec)
2. Chèn dữ liệu
mysql> INSERT INTO IncrementAndDecrementValue VALUES(101,20000); Query OK, 1 row affected (0.13 sec) mysql> INSERT INTO IncrementAndDecrementValue VALUES(102,30000); Query OK, 1 row affected (0.20 sec) mysql> INSERT INTO IncrementAndDecrementValue VALUES(103,40000); Query OK, 1 row affected (0.11 sec)
3. Dữ liệu gốc
mysql> SELECT * FROM IncrementAndDecrementValue;
+--------+------------+ | UserId | UserScores | +--------+------------+ | 101 | 20000 | | 102 | 30000 | | 103 | 40000 | +--------+------------+ 3 rows in set (0.00 sec)
4. Giảm 1 cho UserId = 103
mysql> UPDATE IncrementAndDecrementValue -> SET UserScores = UserScores - 1 -> WHERE UserId = 103; Query OK, 1 row affected (0.41 sec) Rows matched: 1 Changed: 1 Warnings: 0
5. Kết quả
mysql> SELECT * FROM IncrementAndDecrementValue;
+--------+------------+ | UserId | UserScores | +--------+------------+ | 101 | 20000 | | 102 | 30000 | | 103 | 39999 | +--------+------------+ 3 rows in set (0.00 sec)
Mở rộng: Giảm với điều kiện an toàn (không dưới 0)
UPDATE ten_bang SET ten_cot = GREATEST(ten_cot - 1, 0) WHERE dieu_kien;
Mở rộng: Giảm giá trị tùy ý
-- Giảm 10 UPDATE ten_bang SET ten_cot = ten_cot - 10 WHERE dieu_kien; -- Giảm theo tỷ lệ (10%) UPDATE ten_bang SET ten_cot = FLOOR(ten_cot * 0.9) WHERE dieu_kien;
Ứng dụng thực tế
- Giảm tồn kho khi bán hàng
- Giảm số lần thử đăng nhập sai
- Giảm điểm loyalty khi đổi quà
- Countdown timer trong game
Lưu ý hiệu năng
- Index trên cột WHERE (UserId) rất quan trọng
- Row-level lock (InnoDB) - ít xung đột
- Batch update: Gom nhiều điều kiện trong 1 câu lệnh CASE WHEN