2008-10-31 12 views
5

Ví dụ: nếu tôi có trường được đánh số tự động, tôi thêm bản ghi mới mà không chỉ định trường này và cho phép công cụ DB chọn nó cho tôi.
Vì vậy, nó sẽ chọn số lượng bản ghi đã xóa? Nếu có, khi nào?Các khóa chính số của các bản ghi đã xóa trong cơ sở dữ liệu có được sử dụng lại cho các bản ghi mới trong tương lai không?

// SQL Server, MySQL. //

Câu hỏi tiếp theo: What happens when DB engine runs out of numbers to use for primary keys?

Trả lời

14

NO. phím chính số sẽ không được sử dụng lại, ngoại trừ bạn chỉ định chúng bằng tay (bạn thực sự nên tránh điều này!)

+0

Xem câu trả lời từ Martin Bøgelund. Chúng được tái sử dụng trong một số trường hợp. – user984003

+0

Martins trả lời là chính xác, tuy nhiên nó liên quan đến một động cơ DB và trường hợp hiếm hoi và rõ ràng là một lỗi (không biết nếu họ có kế hoạch sửa chữa nó) –

2

Phụ thuộc vào hệ thống tự động đánh số. Nếu bạn đang sử dụng một chuỗi bất kỳ loại nào, số lượng các bản ghi đã xóa sẽ không được sử dụng lại, vì trình tự không biết về chúng.

2

Nói chung, không, các số không được sử dụng lại.

Tuy nhiên, bạn có thể - trong các sản phẩm như Oracle - chỉ định trình tạo trình tự xoay vòng và sẽ sử dụng lại số.

Cho dù đó là số lượng bản ghi đã xóa hay không là vấn đề của ứng dụng của bạn.

1

Không cụ thể. Nếu khóa được đọc từ một chuỗi hoặc cột nhận dạng tự động, chuỗi sẽ chỉ cắm và tạo ra giá trị tiếp theo. Tuy nhiên, bạn có thể hủy kích hoạt (set identity_insert on trên SQL Server) và đặt bất kỳ số nào bạn muốn trong cột miễn là nó không vi phạm ràng buộc duy nhất.

+0

+1, với một sửa chữa nhỏ/caveat cho SQL Server - để chèn một giá trị vào cột nhận dạng, SET IDENTITY_INSERT ON phải được chỉ định trước khi giá trị nhận dạng rõ ràng được chèn vào (xem http://msdn.microsoft.com/en-us/library/ms188059.aspx). –

+0

Cảm ơn. Vâng phát hiện. – ConcernedOfTunbridgeWells

1

Câu hỏi này cần phải được thực hiện chính xác hơn:

... "với Oracle Sequences"

... "với các cột MySQL autonumber"

... vv ...

+0

Tôi đã chỉ định hai công cụ mà tôi quan tâm. –

1

Miễn là bạn tạo bảng chính xác, bạn sẽ không sử dụng lại số. Tuy nhiên bạn có thể gieo hạt cột sắc (IN MSSQL anyway) bằng cách sử dụng như sau:

- Nhập số mục có giá trị cuối cùng trong bảng không phải là số tiếp theo sẽ được sử dụng

DBCC CHECKIDENT ([ TableName], gieo hạt, [NumberYouWantToStartAt])

Đây là khóa học điên ... và không bao giờ nên được thực hiện :)

+0

Tôi sẽ không nói nó KHÔNG BAO GIỜ được thực hiện. Trong tình huống thích hợp, nó hoàn toàn phù hợp. – Kevin

+0

Xin lỗi tôi đã viết dòng cuối cùng trong jest ... Bạn là chính xác rằng điều này là hữu ích đôi khi. –

1

MySQL sẽ không tái sử dụng ID trừ khi bạn truncate bàn hoặc delete from bảng mà không có where khoản (trong trường hợp đó MySQL, nội bộ ly, chỉ cần một truncate).

8

AFAIK, điều này có thể xảy ra trong MySQL:

How AUTO_INCREMENT Handling Works in InnoDB:

InnoDB sử dụng trong bộ nhớ tự động tăng truy cập miễn là chạy máy chủ. Khi máy chủ được dừng lại và khởi động lại, InnoDB khởi động lại bộ đếm cho mỗi bảng cho INSERT đầu tiên cho bảng, như được mô tả trước đó.

After a restart of server. Innodb reuse previously generated auto_increment values. :

sửa chữa đề nghị: bảng InnoDB không nên mất theo dõi của số tiếp theo cho cột auto_increment sau khởi động lại.

+0

Có, thử nghiệm điều này và nó là đúng: (Tôi đã xóa id cao nhất và sau đó khởi động lại máy chủ. Tôi sau đó đã làm một chèn và id đã được tái sử dụng. – user984003

0

Vâng, nó thực sự phụ thuộc vào cách bạn tạo id. Ví dụ nếu bạn đang sử dụng GUID làm khóa chính, hầu hết việc triển khai một Guid mới ngẫu nhiên sẽ không có khả năng chọn lại một guid khác, nhưng nó sẽ có đủ thời gian và nếu Guid không có trong bảng chèn tuyên bố sẽ đi tốt, nhưng nếu đã có một guid có bạn sẽ nhận được một sự vi phạm chính ràng buộc chính.

0

Tôi xem xét "tính năng" của MySQL về việc sử dụng lại lỗi của id.

Xem xét điều gì đó như xử lý tải tệp lên. Sử dụng id cơ sở dữ liệu làm tên tệp là một phương pháp hay: đơn giản, không có nguy cơ bị khai thác với tên tệp do người dùng cung cấp, v.v.

Bạn thực sự không thể giao dịch khi hệ thống tệp liên quan ... bạn sẽ có để thực hiện giao dịch cơ sở dữ liệu, sau đó ghi tệp hoặc ghi tệp và cam kết giao dịch cơ sở dữ liệu, nhưng nếu một hoặc cả hai không thành công hoặc bạn gặp sự cố hoặc hệ thống tệp mạng của bạn phù hợp, bạn có thể có bản ghi hợp lệ trong cơ sở dữ liệu và không có tệp hoặc tệp nào không có bản ghi cơ sở dữ liệu, vì điều này không phải là nguyên tử.

Nếu sự cố như vậy xảy ra và điều đầu tiên máy chủ thực hiện khi quay lại là ghi đè các id và do đó các tệp, các giao dịch được cuộn lại, nó sẽ bị mất. Những tệp đó có thể hữu ích.

0

không, hãy tưởng tượng xem ngân hàng của bạn đã quyết định sử dụng lại account_id của bạn - arghhhh !!