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

Cách sắp xếp lại khóa (reorder keys) sau khi xóa bản ghi trong MySQL

MySQL không tự động dồn dẹp (compact) giá trị khóa chính (AUTO_INCREMENT hay cột số thường) sau khi xóa hàng. Nếu bạn cần các ID liên tục không bị rỗng, phải cập nhật thủ công bằng UPDATE có tính toán.

Quy trình 2 bước

  1. Xóa hàng không cần bằng DELETE.
  2. Cập nhật các ID lớn hơn ID vừa xóa: giảm đi một khoảng bằng "khoảng trống" vừa tạo.

Ví dụ minh họa

Tạo bảng và chèn ID 10, 20, 30, 40:

mysql> CREATE TABLE DemoTable1476 (Id INT);
mysql> INSERT INTO DemoTable1476 VALUES (10), (20), (30), (40);

Xóa ID = 30:

mysql> DELETE FROM DemoTable1476 WHERE Id = 30;

Bảng còn: 10, 20, 40 (thiếu 30).

Cập nhật: giảm 10 đơn vị cho các ID > 30 (để 40 thành 30):

mysql> UPDATE DemoTable1476 SET Id = Id - 10 WHERE Id > 30;

Kết quả: 10, 20, 30 (liên tục).

⚠️ Cảnh quan trọng

  • Không làm thế này trên cột khóa chính (PRIMARY KEY) hoặc cột được tham chiếu bởi FOREIGN KEY – sẽ vi phạm ràng buộc toàn vẹn.
  • Chỉ áp dụng cho cột số thông thường, không có ràng buộc.
  • Với AUTO_INCREMENT, MySQL không tái sử dụng ID đã xóa (đây là thiết kế chuẩn để tránh xung đột replication, log, v.v.).
  • Trong thực tế production, **không nên renumber khóa chính**; hãy chấp nhận các "lỗ hổng" (gaps) – đó là bình thường.

Nếu chỉ cần hiển thị số thứ tự liên tục cho báo cáo, hãy dùng ROW_NUMBER() (MySQL 8.0+) trong SELECT thay vì sửa dữ liệu.