2010-05-08 20 views
5

tất cả. Tôi có một bảng trong DB của tôi có khoảng một ngàn bản ghi trong đó. Tôi muốn đặt lại cột nhận dạng sao cho tất cả các ID là tuần tự một lần nữa. Tôi đã nhìn vào this nhưng tôi giả định rằng nó chỉ hoạt động trên một bảng trốngID đặt lại SQL trong bảng đã điền sẵn

hiện tại Bảng

ID | Name 
1   Joe 
2   Phil 
5   Jan 
88   Rob 

mong muốn Bảng

ID | Name 
1   Joe 
2   Phil 
3   Jan 
4   Rob 

Cảm ơn trước

+0

Cột Nhận dạng của bạn có được sử dụng làm khóa ngoại ở nơi khác không? – uhleeka

+0

không, nó chỉ là duy nhất bởi vì có một trường khác trong bảng tham khảo nó. –

+0

IE: 'ID | ParentID | Name' –

Trả lời

5

Cách đơn giản nhất sẽ tạo một bản sao của bảng hiện tại, sửa chữa bất kỳ vấn đề ParentID, thả nó và sau đó đổi tên mới.

Bạn cũng có thể tạm thời loại bỏ các IDENTITY và thử folowing:

;WITH TBL AS 
(
    SELECT *, ROW_NUMBER(ORDER BY ID) AS RN 
    FROM CURRENT_TABLE 
) 
UPDATE TBL 
SET ID = RN 

Hoặc, nếu bạn không quan tâm đến thứ tự của hồ sơ,

DECLARE INT @id; 
SET @id = 0; 

UPDATE CURRENT_TABLE 
SET @id = ID = @id + 1; 
-2

Sử dụng DBCC CHECKIDENT. bảng không cần phải có sản phẩm nào:

  • DBCC CHECKIDENT (table_name, NORESEED)

giá trị bản sắc hiện tại chưa được đặt lại. DBCC CHECKIDENT trả về giá trị nhận dạng hiện tại và giá trị tối đa hiện tại của cột nhận dạng. Nếu hai giá trị không giống nhau, bạn phải đặt lại giá trị danh tính thành tránh các lỗi hoặc khoảng trống tiềm ẩn trong chuỗi giá trị .

  • DBCC CHECKIDENT (table_name) hoặc DBCC CHECKIDENT (table_name, RESEED)

Nếu giá trị bản sắc hiện tại cho một bảng là thấp hơn giá trị sắc tối đa được lưu trữ trong cột sắc , nó được thiết lập lại bằng cách sử dụng tối đa giá trị trong bản sắc cột.

  • DBCC CHECKIDENT (table_name, RESEED, new_reseed_value)

giá trị bản sắc hiện tại được thiết lập để các new_reseed_value. Nếu không có hàng đã chèn vào bảng kể từ khi bảng đã được tạo ra, hoặc nếu tất cả các hàng đã được gỡ bỏ bằng cách sử dụng các TRUNCATE TABLE, hàng đầu tiên chèn sau khi bạn chạy DBCC CHECKIDENT sử dụng new_reseed_value như danh tánh. Nếu không, hàng tiếp theo được chèn vào sử dụng new_reseed_value + giá trị gia tăng hiện tại.

Nếu bảng không phải là trống rỗng, thiết lập các giá trị sắc đối với một số ít hơn giá trị lớn nhất trong danh cột có thể dẫn đến một trong những điều kiện sau đây:

  • Nếu một TIỂU Ràng buộc KEY hoặc UNIQUE tồn tại trên cột nhận dạng , thông báo lỗi 2627 sẽ là được tạo trên các hoạt động chèn sau vào bảng do giá trị nhận dạng được tạo sẽ xung đột với hiện tại giá trị.

  • Nếu không có ràng buộc PRIMARY KEY hoặc UNIQUE, sau đó các hoạt động chèn sẽ dẫn đến giá trị nhận dạng trùng lặp.

+0

Điều này không thực sự hiệu quả. Như bài báo nói, nếu tôi chạy 'DBCC CHECKIDENT (tên_bảng, RESEED, new_reseed_value)' thì tôi không thể chèn các bản ghi mới nơi các bản ghi cũ hiện đang có. Có vẻ như cách duy nhất để làm điều này là chèn dữ liệu vào một bảng mới (tạo lại ID), thả bảng cũ, và sau đó đổi tên bảng mới thành tên bảng cũ. –

+0

Điều này sẽ thay đổi ony chèn giá trị hạt giống tiếp theo của danh tính; không cập nhật các giá trị nhận dạng hiện có. –

1

giải pháp nhanh này sẽ là đến:

  1. tạo bảng mới với cùng một lược đồ
  2. sao chép bảng cũ sang cái mới (trừ cột sắc)
  3. xóa bảng cũ
  4. đổi tên bảng
1

mới Bởi vì bạn có phím nước ngoài trong cùng một bảng (mỗi bình luận của bạn), bạn sẽ cần phải bảo toàn bản đồ từ cũ sang mới ở đâu đó và tái kích hoạt các khóa ngoại để khớp với các bản sắc mới.

Có một số cách tiếp cận để thực hiện việc này, nhưng tôi thực sự sẽ yêu cầu cập nhật khóa chính của bạn, đặc biệt là vì bạn đã có khóa ngoại quốc tham chiếu, và đó chỉ là khóa thay thế. Nó không giống như bạn đang thay đổi chìa khóa thay thế của bạn để một GUID hoặc một cái gì đó đặc biệt.

3

một cách, quấn này trong một giao dịch

select id,name into #temp from YourTable 

     truncate table YourTable 

     insert YourTable (name) 
     select name from #temp 
+0

rất đẹp! thanh lịch và đơn giản. – uhleeka

+0

nhưng nó không sửa chữa ParentID của bạn. – mdma

+4

không có gì về parentid trong câu hỏi khi tôi trả lời – SQLMenace

0

Đây là cách tôi reset lĩnh vực nhận dạng. Phiên bản CTE (Biểu thức bảng chung) ở trên là quá mức cần thiết. Chỉ cần sử dụng Số Hàng hiện tại để cập nhật cột nhận dạng bằng cách sử dụng câu lệnh cập nhật đơn giản với tham gia:

UPDATE [YourTable] SET ID = rn.RowNumber FROM [YourTable] 
JOIN (SELECT ID, ROW_NUMBER() OVER (ORDER BY ID) AS RowNumber 
    FROM [YourTable]) rn ON rn.ID = [YourTable].ID 

Tuyên bố này có thể được tái cấu trúc đơn giản hơn. Nếu vậy, tôi rất thích xem phiên bản đơn giản hơn.

Tôi hy vọng điều này sẽ giúp ai đó.

Các vấn đề liên quan