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

Cách đặt auto-increment về giá trị thấp hơn trong MySQL?

Với engine InnoDB (mặc định), không thể đặt AUTO_INCREMENT về giá trị ≤ MAX hiện có. Cần dùng engine MyISAM hoặc tạo bảng mới.

Hành vi theo Engine

EngineHành vi ALTER TABLE ... AUTO_INCREMENT = N
MyISAMNếu N ≤ MAX(id): reset về MAX+1. Nếu N > MAX: đặt thành N.
InnoDBNếu N < MAX(id): bỏ qua, giữ nguyên sequence. Nếu N > MAX: đặt thành N.

Ví dụ với MyISAM

mysql> CREATE TABLE DemoTable (Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY) ENGINE='MyISAM';

Chèn 6 hàng (ID 1-6)

mysql> INSERT INTO DemoTable VALUES(),(),(),(),(),();
+----+
| Id |
+----+
| 1  | 2 | 3 | 4 | 5 | 6 |
+----+

Xóa ID 4,5,6

mysql> DELETE FROM DemoTable WHERE Id IN (4,5,6);
+----+
| Id |
+----+
| 1  | 2 | 3 |
+----+

Đặt AUTO_INCREMENT = 4 (MyISAM cho phép)

mysql> ALTER TABLE DemoTable AUTO_INCREMENT = 4;
Query OK, 3 rows affected

Chèn tiếp 3 hàng

mysql> INSERT INTO DemoTable VALUES(),(),();
+----+
| Id |
+----+
| 1 | 2 | 3 | 4 | 5 | 6 |
+----+

ID mới bắt đầu từ 4 (MAX hiện tại 3 + 1).

Với InnoDB (không thể giảm)

mysql> CREATE TABLE DemoTable (Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB;
-- Chèn 1-6, xóa 4-6, còn 1-3
mysql> ALTER TABLE DemoTable AUTO_INCREMENT = 4; -- Bỏ qua, next_id vẫn là 7

Giải pháp cho InnoDB: Tạo bảng mới

CREATE TABLE NewTable LIKE DemoTable;
ALTER TABLE NewTable AUTO_INCREMENT = 4;
INSERT INTO NewTable SELECT * FROM DemoTable;
RENAME TABLE DemoTable TO OldTable, NewTable TO DemoTable;

Lưu ý

  • Không khuyến khích reset auto_increment thường xuyên — ID gap là bình thường
  • MyISAM không hỗ trợ transaction, foreign key — ít dùng trong production hiện nay
  • UUID hoặc BIGINT auto_increment giảm lo ngại cạn ID