Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Cộng giá trị vào cột INT không cần biết giá trị hiện tại trong MySQL

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).