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

Thực hiện UPDATE tăng dần (Increment) trong MySQL


Sử dụng biến người dùng (user-defined variable) để cập nhật các hàng với giá trị tăng dần.

Cú pháp

SET @inc := start_value;
UPDATE table_name SET column = (@inc := @inc + increment_value);

Ví dụ minh họa

mysql> CREATE TABLE UpdateValueIncrementally (ProductId INT);
Query OK, 0 rows affected (0.90 sec)

mysql> INSERT INTO UpdateValueIncrementally VALUES (10), (100), (1000), (110), (102);
Query OK, 5 rows affected

Khởi tạo biến và cập nhật:

mysql> SET @incrementValue := 33333;
Query OK, 0 rows affected

mysql> UPDATE UpdateValueIncrementally 
SET ProductId = (SELECT @incrementValue := @incrementValue + @incrementValue);

Kết quả (giá trị gấp đôi mỗi lần):

+-----------+
| ProductId |
+-----------+
| 66666     |
| 133332    |
| 266664    |
| 533328    |
| 1066656   |
+-----------+

Các mẫu phổ biến

Đánh số thứ tự (1,2,3...):

SET @rownum := 0;
UPDATE table_name SET seq_col = (@rownum := @rownum + 1) ORDER BY some_col;

Tăng đều (step = 10):

SET @val := 100;
UPDATE table_name SET col = (@val := @val + 10) ORDER BY id;

Cách hiện đại: Window Function (MySQL 8.0+)

Để SELECT (không UPDATE):

SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS rn FROM table_name;

Để UPDATE (MySQL 8.0.2+ hỗ trợ CTE trong UPDATE):

WITH numbered AS (
  SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS rn FROM table_name
)
UPDATE table_name t JOIN numbered n ON t.id = n.id
SET t.seq_col = n.rn;

Lưu ý quan trọng

  • Thứ tự UPDATE không đảm bảo nếu không có ORDER BY (MySQL không hỗ trợ ORDER BY trong UPDATE đơn giản trước 8.0).
  • Biến user-defined không an toàn cho replication (statement-based).
  • Khuyến nghị: dùng ứng dụng (PHP/Python/Node) để tính toán rồi UPDATE hàng loạt.