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
| Engine | Hành vi ALTER TABLE ... AUTO_INCREMENT = N |
|---|---|
| MyISAM | Nếu N ≤ MAX(id): reset về MAX+1. Nếu N > MAX: đặt thành N. |
| InnoDB | Nế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