Đặt lại giá trị IDENTITY


16

Tôi có một bảng với một cột IDENTITY. Trong khi phát triển, tôi xóa các hàng theo thời gian và thêm chúng một lần nữa. Nhưng các giá trị IDENTITY luôn tăng và không bắt đầu từ 1 khi tôi thêm chúng lần nữa. Bây giờ id của tôi đi từ 68 -> 92 và điều này làm hỏng mã của tôi.

Làm cách nào để đặt lại giá trị IDENTITY?


Tôi sẽ làm cho mã của mình trở nên linh hoạt hơn với các giá trị nhận dạng bị thiếu. Một cột danh tính không đảm bảo đánh số liên tục và cuối cùng sẽ xảy ra
Trub

Câu trả lời:


29

Bạn có thể đặt lại giá trị danh tính bằng cách

DBCC CHECKIDENT('tableName', RESEED, 0)

Vì vậy, lần tới khi bạn chèn vào TableName, giá trị nhận dạng được chèn sẽ là 1.

Khi bạn xóa các hàng khỏi bảng, nó sẽ không đặt lại giá trị Danh tính, nhưng nó sẽ tiếp tục tăng nó. Giống như những gì đã xảy ra trong trường hợp của bạn.

Bây giờ khi bạn cắt bớt bảng, nó sẽ đặt lại giá trị Danh tính thành giá trị Seed ban đầu của bảng.

Tham khảo: SQL SERVER - XÓA, TRUNCATE và RESEED Nhận dạng để biết ví dụ chi tiết và một số giải thích tốt về Sự khác biệt giữa Cắt ngắn và Xóa


22

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.


-4

Nếu bạn chỉ cần loại bỏ các hàng cuối cùng không tuân theo giá trị gia tăng của trường nhận dạng, có một cách dễ dàng và an toàn:

  1. đầu tiên xóa (các) bản ghi cuối cùng đã 'nhảy'
  2. thay đổi kiểu dữ liệu của Trường nhận dạng của bạn (từ int sang bigint hoặc ngược lại)
  3. lưu bàn
  4. thêm một bản ghi mới và kiểm tra nó chỉ định số lượng giá trị cao nhất + 1
  5. Thay thế kiểu dữ liệu của Trường nhận dạng, thuận tiện cho nhu cầu của bạn

và bạn đã hoàn thành.


3
"Lưu bảng" không phải là một tuyên bố có ý nghĩa đối với SQL Server. Thay đổi loại dữ liệu có thể không đáng kể với ít hơn 100 hàng nhưng có thể rất tốn kém cho các bảng lớn.
Michael Green

2
Tôi giả sử bạn có nghĩa là trong SSMS. Điều này sẽ tạo một bảng mới, sao chép tất cả các hàng vào đó, thả bảng cũ và đổi tên bảng mới. Và bạn cần làm điều này hai lần để chuyển đổi kiểu dữ liệu trở lại. Nó đang sử dụng búa tạ để bẻ đai ốc.
Martin Smith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.