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

Reset AUTO_INCREMENT (khóa chính) trong MySQL

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 TABLE là DDL – không thể ROLLBACK, không kích hoạt trigger DELETE, reset AUTO_INCREMENT.
  • DELETE FROM table (DML) – KHÔNG reset AUTO_INCREMENT, có thể rollback, kích hoạt trigger.
  • ALTER TABLE ... AUTO_INCREMENT = N chỉ đặ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.