2009-03-27 39 views
6

Tôi có nhu cầu thay đổi giá trị MỘT PK trong một hàng của một bảng dữ liệu SQLSERVER 2005 databsae. PK hiện đang tăng tự động.Cập nhật cột tự động tăng tốc trong máy chủ SQL

Một khả năng là tạm thời xóa tự động tăng từ khóa, thực hiện sửa đổi và đặt lại.

Cơ sở dữ liệu đang được sản xuất. Có cách nào để thực hiện thay đổi một cách an toàn mà không lấy DB xuống không?

Tại sao? Khách hàng của tôi muốn một ID cụ thể cho một trong các hồ sơ.

Tôi sợ điều gì? Tôi sợ hồ sơ được thêm vào trong DB trong khi tôi đã sửa đổi chìa khóa, và nó bằng cách nào đó messing lên một chỉ số trên một bảng có sử dụng các lĩnh vực như là một FK? Tôi có hạt không?

+1

Đừng quên rằng bất kỳ bảng nào tham chiếu khóa chính này sẽ cần được cập nhật thành giá trị mới trước khi bạn có thể xóa hàng cũ. – mrdenny

Trả lời

14

Đang cập nhật không làm việc - bạn phải chèn kỷ lục mới và xóa cái cũ để thay thế ...

set identity_insert mytable on 

insert mytable (myidentitycolumn, someothercolumn) 
select 42, someothercolumn 
from mytable 
where myidentitycolumn = 1; 

delete mytable where myidentitycolumn = 1; 

set identity_insert mytable off 
+0

Điều này không hoạt động = "Không thể cập nhật cột nhận dạng XXXXX" –

+0

matt - bạn nói đúng. câu trả lời đã được cập nhật cho phù hợp và cũng là câu trả lời +1 cho câu trả lời của bạn. –

+0

Bạn nên làm ngay bây giờ :) –

4

Bạn chỉ có thể cập nhật thông qua xóa danh tính và tạo lại danh tính. Tuy nhiên, bạn cũng có thể thiết lập chèn thông tin nhận dạng (http://msdn.microsoft.com/en-us/library/aa259221(SQL.80).aspx) và chèn một hàng mới có mã định danh bạn muốn, tắt tính năng chèn nhận dạng, sau đó xóa giá trị cũ. Tại sao bạn muốn làm nó?

3
SET IDENTITY_INSERT yourTable ON 

INSERT INTO yourTable (col1, col2, col3) 
select newID, col2, col3 
FROM yourTable 
WHERE currentID = xxx 

SET IDENTITY_INSERT yourTable OFF 

Bạn có thể muốn để khóa bảng để ngăn chặn chèn khác từ không thành công khi IDENTITY_INSERT bật.

EDIT: Vâng crap, tôi quên mất một chút rõ ràng về việc xóa bản ghi gốc.

0
DECLARE @counter int 
SET @counter = 0 
UPDATE #tmp_Users 
SET @counter = counter = @counter + 1 
+0

Vui lòng chỉnh sửa với nhiều thông tin hơn. Các câu trả lời chỉ có mã và "dùng thử" này không được khuyến khích, bởi vì chúng không chứa nội dung có thể tìm kiếm được và không giải thích tại sao một người nào đó nên "thử cái này". – abarisone

+0

Câu trả lời này được bật lên trong hàng đợi đánh giá chất lượng thấp, có lẽ vì bạn không cung cấp bất kỳ lời giải thích nào về mã. Nếu mã này trả lời câu hỏi, hãy cân nhắc việc thêm một số văn bản giải thích mã trong câu trả lời của bạn. Bằng cách này, bạn có nhiều khả năng nhận được nhiều upvotes hơn - và giúp người hỏi tìm hiểu điều gì đó mới mẻ. – lmo

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