Để reset giá trị AUTO_INCREMENT về 1 sau khi xóa hết dữ liệu, kết hợp ALTER TABLE ... AUTO_INCREMENT = 1 và TRUNCATE TABLE.
Cú pháp
ALTER TABLE tên_bảng AUTO_INCREMENT = 1; TRUNCATE TABLE tên_bảng;
Thứ tự quan trọng: ALTER trước, TRUNCATE sau. TRUNCATE sẽ reset AUTO_INCREMENT về giá trị đã thiết lập.
Ví dụ minh họa
Tạo bảng demo:
mysql> CREATE TABLE resettingPrimaryKeyDemo (
-> UserId INT NOT NULL AUTO_INCREMENT PRIMARY KEY
-> );
Query OK, 0 rows affected (0.66 sec)
Chèn 4 hàng (ID 1-4):
mysql> INSERT INTO resettingPrimaryKeyDemo VALUES (), (), (), ();
+--------+ | UserId | +--------+ | 1 | | 2 | | 3 | | 4 | +--------+
Reset AUTO_INCREMENT và xóa dữ liệu:
mysql> ALTER TABLE resettingPrimaryKeyDemo AUTO_INCREMENT = 1; Query OK, 0 rows affected (0.14 sec) mysql> TRUNCATE TABLE resettingPrimaryKeyDemo; Query OK, 0 rows affected (0.89 sec)
Kiểm tra bảng rỗng:
mysql> SELECT * FROM resettingPrimaryKeyDemo; Empty set (0.00 sec)
Chèn lại 3 hàng — ID bắt đầu từ 1:
mysql> INSERT INTO resettingPrimaryKeyDemo VALUES (), (), ();
+--------+ | UserId | +--------+ | 1 | | 2 | | 3 | +--------+
Phân biệt DELETE vs TRUNCATE
| Đặc điểm | DELETE | TRUNCATE |
|---|---|---|
| Reset AUTO_INCREMENT | Không | Có (về 1 hoặc giá trị ALTER) |
| Kích hoạt TRIGGER | Có | Không |
| Rollback được | Có (trong transaction) | Không (DDL) |
| Tốc độ | Chậm (ghi log từng hàng) | Rất nhanh (deallocate pages) |
| WHERE clause | Có | Không |
Chỉ reset AUTO_INCREMENT không xóa dữ liệu
ALTER TABLE tên_bảng AUTO_INCREMENT = 1;
Giá trị tiếp theo sẽ là 1 (hoặc MAX(id)+1 nếu lớn hơn 1).
⚠️ Cảnh báo
- Không reset AUTO_INCREMENT trên bảng production đang hoạt động
- Nếu có FOREIGN KEY tham chiếu, TRUNCATE sẽ thất bại (cần disable FK check)
- Replication: TRUNCATE ghi binlog, có thể gây xung đột trên Slave