Vấn đề: Đặt lại giá trị AUTO_INCREMENT về 1 sau khi xóa dữ liệu
Sau khi xóa các hàng, AUTO_INCREMENT tiếp tục từ giá trị cũ. Cần reset về 1 cho bảng trống.
Giải pháp: TRUNCATE TABLE + ALTER TABLE AUTO_INCREMENT
TRUNCATE xóa toàn bộ dữ liệu VÀ reset AUTO_INCREMENT về giá trị khởi tạo (thường là 1). ALTER TABLE cho phép đặt giá trị bắt đầu tùy ý.
1. Tạo bảng và chèn dữ liệu
CREATE TABLE DemoTable (
UserId INT NOT NULL AUTO_INCREMENT PRIMARY KEY
);
INSERT INTO DemoTable VALUES (), (), (); -- Tự động ID 1,2,3
2. Dữ liệu trước reset
+--------+
| UserId |
+--------+
| 1 |
| 2 |
| 3 |
+--------+
3. Reset AUTO_INCREMENT
TRUNCATE TABLE DemoTable; -- Xóa dữ liệu, reset AI về 1
ALTER TABLE DemoTable AUTO_INCREMENT = 1; -- Đảm bảo/explicit đặt về 1
4. Chèn lại, ID bắt đầu từ 1
INSERT INTO DemoTable VALUES (), ();
+--------+
| UserId |
+--------+
| 1 |
| 2 |
+--------+
Lưu ý quan trọng
TRUNCATE TABLElà DDL – không thể ROLLBACK, không kích hoạt triggerDELETE, reset AUTO_INCREMENT.DELETE FROM table(DML) – KHÔNG reset AUTO_INCREMENT, có thể rollback, kích hoạt trigger.ALTER TABLE ... AUTO_INCREMENT = Nchỉ đặt giá trị tiếp theo sẽ sinh ra. Giá trị phải > max ID hiện có (nếu bảng không trống).- InnoDB: Giá trị AUTO_INCREMENT lưu trong memory, mất khi restart (MySQL < 8.0). Từ 8.0 lưu vào redo log – bền vững hơn.
Khi nào cần reset?
- Môi trường test/dev – dọn dẹp dữ liệu test.
- Sau khi xóa toàn bộ dữ liệu production (hiếm, cẩn thận).
- Không nên reset trên bảng production đang hoạt động – có thể gây trùng khóa nếu ứng dụng cache ID.