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

Cách xử lý phân mảnh cột auto_increment ID trong MySQL?


Khi xóa bản ghi có ID lớn nhất, restart MySQL, hoặc chèn mới → có thể gây phân mảnh (gap) trong dãy auto_increment.

MySQL 5.6+ InnoDB cho phép reuse ID bằng cách chỉ định giá trị trong INSERT.

Tình huống gây phân mảnh

  • Xóa ID lớn nhất
  • Khởi động lại MySQL server
  • Chèn bản ghi mới

Ví dụ

mysql> CREATE TABLE UniqueAutoId (
    -> id INT AUTO_INCREMENT,
    -> UNIQUE(id)
    -> );
Query OK, 0 rows affected (0.45 sec)
mysql> INSERT INTO UniqueAutoId VALUES(); -- 5 lần
Query OK, 1 row affected ... (x5)
mysql> SELECT * FROM UniqueAutoId;
+----+
| id |
+----+
| 1  |
| 2  |
| 3  |
| 4  |
| 5  |
+----+
5 rows in set (0.00 sec)

Xóa id=5 (ID lớn nhất)

mysql> DELETE FROM UniqueAutoId WHERE id=5;
Query OK, 1 row affected (0.14 sec)
+----+
| id |
+----+
| 1  |
| 2  |
| 3  |
| 4  |
+----+
4 rows in set (0.00 sec)

Xóa id=2 (giữa)

mysql> DELETE FROM UniqueAutoId WHERE id=2;
Query OK, 1 row affected (0.15 sec)
+----+
| id |
+----+
| 1  |
| 3  |
| 4  |
+----+
3 rows in set (0.00 sec)

Dãy ID bị phân mảnh: 1, 3, 4 (thiếu 2, 5).