mục đích của AUTO_INCREMENT
là để tạo ra định danh duy nhất và vô nghĩa đơn giản cho các hàng của bạn. Ngay sau khi bạn định sử dụng lại các ID đó, chúng không còn độc đáo nữa (không phải ít nhất là theo thời gian) để tôi có ấn tượng rằng bạn không sử dụng đúng công cụ cho công việc. Nếu bạn quyết định loại bỏ AUTO_INCREMENT
, bạn có thể thực hiện tất cả các lần chèn bằng cùng một thuật toán.
Như về mã SQL, truy vấn này sẽ phù hợp với hàng hiện có với các hàng có ID tiếp theo:
SELECT a.foo_id, b.foo_id
FROM foo a
LEFT JOIN foo b ON a.foo_id=b.foo_id-1
Ví dụ:
1 NULL
4 NULL
10 NULL
12 NULL
17 NULL
19 20
20 NULL
24 25
25 26
26 27
27 NULL
Vì vậy, thật dễ dàng để lọc ra các hàng và nhận được khoảng cách đầu tiên:
SELECT MIN(a.foo_id)+1 AS next_id
FROM foo a
LEFT JOIN foo b ON a.foo_id=b.foo_id-1
WHERE b.foo_id IS NULL
Hãy coi đây là điểm khởi đầu vì nó vẫn cần chỉnh sửa:
- Bạn cần xem xét trường hợp số thấp nhất có sẵn là số thấp nhất có thể.
- Bạn cần khóa bàn để xử lý các lần chèn đồng thời.
- Trong máy tính của tôi, nó chậm như địa ngục với các bảng lớn.
Nguồn
2012-04-17 10:41:33
Tại sao bạn muốn thực hiện việc này? Những "lỗ hổng" như vậy là _normal_ trong hoạt động cơ sở dữ liệu hàng ngày và không phải là mối quan tâm. Nếu điều này là do một số khái niệm sai lầm về tính thẩm mỹ, hãy chống lại nó. – Oded
Bạn không nên. Một auto_increment chỉ nên làm công việc của mình, và điều đó có nghĩa là lỗ có thể được thực hiện. Nếu bạn bắt đầu rối tung với điều đó, bạn sẽ gặp rắc rối sau này. Chỉ cần để cho họ được. – Nanne
Chưa kể rằng nếu ID bị xóa vẫn được tham chiếu ở đâu đó, tức là thông qua bảng liên kết được đánh dấu/không được cập nhật, thì việc thêm hàng mới vào bằng ID đó sẽ tạo ra các sự cố không mong muốn. Theo Oded, Nanne, chỉ cần rời khỏi AI để thực hiện công việc của mình. –