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.