Được 👍 nhưng còn tùy bạn đang dùng hệ quản trị CSDL nào (MySQL, MariaDB, SQLite, PostgreSQL…).

Nguyên tắc:

  • Trường AUTO_INCREMENT (MySQL/MariaDB) hay SERIAL (PostgreSQL) chỉ tự động tăng khi bạn không chỉ định giá trị.
  • Nếu bạn xóa một bản ghi rồi sau đó INSERT với giá trị ID cụ thể (trùng với ID cũ), thì hoàn toàn hợp lệ miễn là chưa có bản ghi nào khác đang giữ ID đó.
  • Bộ đếm AUTO_INCREMENT sẽ không lùi lại. Nghĩa là nếu bạn đã có bản ghi tới ID = 100, xoá nó, rồi tự INSERT lại với ID=100 thì vẫn được. Nhưng lần kế tiếp bạn không truyền ID thì CSDL sẽ sinh ra ID = 101 (không quay lại 100).

Ví dụ (MySQL):

CREATE TABLE test (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50)
);

INSERT INTO test (name) VALUES ('A'); -- id = 1
INSERT INTO test (name) VALUES ('B'); -- id = 2

DELETE FROM test WHERE id = 2;

INSERT INTO test (id, name) VALUES (2, 'B new'); -- OK, id = 2 gán lại thủ công

INSERT INTO test (name) VALUES ('C'); -- id = 3 (không quay về 2)

👉 Tóm lại:

  • Có thể insert lại ID đã xoá, nếu chưa bị chiếm.
  • Bộ đếm tự tăng không reset, trừ khi bạn ALTER TABLE AUTO_INCREMENT về giá trị mong muốn.

Bạn có muốn mình viết luôn câu lệnh để reset lại AUTO_INCREMENT sau khi xóa không, để hệ thống tự sinh ID về lỗ hổng đã xóa?