Kin đã chỉ cho bạn cách bạn có thể đặt lại giá trị IDENTITY, nhưng bên ngoài môi trường phát triển khi bạn thực sự xóa tất cả dữ liệu, tại sao bạn cần phải làm điều này?
Tôi hy vọng bạn không có ý định duy trì một chuỗi các giá trị IDENTITY liền kề khi bạn đang sản xuất. Và tôi hy vọng bạn không thực sự viết mã của mình để mã hóa các giá trị IDENTITY. Nếu đây là các giá trị ID có ý nghĩa thì bạn nên ngừng sử dụng thuộc tính IDENTITY.
Có một vài điều sẽ ngăn điều này xảy ra:
- nếu giá trị IDENTITY được chỉ định trong khi giao dịch và giao dịch được khôi phục, giá trị đó không được "trả lại" và giá trị tiếp theo sẽ là giá trị không bao giờ được sử dụng + 1.
- nếu một hàng bị xóa sau đó, IDENTITY sẽ không bao giờ quay lại để điền vào các khoảng trống.
- có một lỗi hoạt động trong SQL Server 2012
sẽ không được sửa cho đến khi SQL Server 2014 sẽ không bao giờ được sửa (trừ khi bạn sử dụng cờ theo dõi không có giấy tờ và rất tốn kém), theo đó, việc khởi động lại dường như sẽ loại bỏ tới 1000 giá trị từ cột IDENTITY của bạn . Lỗi trên Connect cho thấy rằng điều này bị hạn chế đối với các sự kiện chuyển đổi dự phòng liên quan đến Nhóm khả dụng nhưng tôi có thể đảm bảo với bạn rằng lỗi này rộng hơn thế nhiều.
Nói tóm lại, nếu bạn quan tâm đến những khoảng trống hoặc muốn cung cấp cho các giá trị này ý nghĩa cụ thể, hãy ngừng sử dụng IDENTITY. Thả và tạo lại bảng và khi bạn cần xóa các giá trị và nhập lại, thực hiện cập nhật hoặc thực hiện chèn với các giá trị được mã hóa cứng cho cột đó.
Như một bên, khóa chính và danh tính không giống nhau. Cột định danh không phải là khóa chính trừ khi bạn xác định rõ ràng như vậy và chắc chắn bạn có thể có khóa chính không phải là cột nhận dạng.