2009-09-04 57 views
19

Tôi cần cập nhật khóa chính cho bản ghi nhưng đó cũng là khóa ngoài trong hai bảng khác. Và tôi cũng cần khóa chính được cập nhật để được thể hiện trong bảng con.SQL Server cập nhật khóa chính cũng là khóa ngoài trong hai bảng

Đây là câu hỏi của tôi và các lỗi:

begin tran 
update question set questionparent = 10000, questionid= 10005 where questionid = 11000;
Error 9/4/2009 10:04:49 AM 0:00:00.000 SQL Server Database Error: The UPDATE statement conflicted with the REFERENCE constraint "FK_GoalRequirement_Question". The conflict occurred in database "numgmttest", table "dbo.GoalRequirement", column 'QuestionID'. 14 0 

Tôi không nhớ làm thế nào để đi về việc này vì vậy đó là lý do tại sao tôi ở đây. Bất kỳ giúp đỡ?

+0

Một tùy chọn khác: tránh có khóa chính có thể thay đổi. Sử dụng một IDENTITY làm khóa chính thay thế. Giữ một ràng buộc duy nhất trên các cột cần phải là duy nhất. Điều đó có thể nằm ngoài tầm kiểm soát của bạn, nhưng nó hoạt động tốt cho chúng tôi. Người dùng của chúng tôi có thể thay đổi ID bao nhiêu tùy thích và không ảnh hưởng đến khóa chính thực sự. –

Trả lời

16

Bạn có thể:

  1. vô hiệu hóa thực thi hạn chế FK tạm thời (xem here hoặc here)
  2. cập nhật PK của bạn
  3. cập nhật FKS bạn
  4. phép trở lại thực thi hạn chế FK

thực hiện tất cả trong một giao dịch và đảm bảo rằng nếu giao dịch không thành công, bạn quay lại đúng và vẫn thực thi các ràng buộc FK.

Nhưng ... tại sao bạn cần thay đổi PK? Tôi hy vọng đây là một hành động được thực hiện hiếm khi (nhập dữ liệu cũ hoặc một cái gì đó như thế).

33

Are mối quan hệ của bạn sử dụng

ON UPDATE CASCADE 

Nếu họ sau đó được thay đổi phím trong bảng chính sẽ cập nhật các phím nước ngoài.

ví dụ:

ALTER TABLE Books 
ADD CONSTRAINT fk_author 
FOREIGN KEY (AuthorID) 
REFERENCES Authors (AuthorID) ON UPDATE CASCADE 
+0

Bất cứ ai để nói mà không cần nhìn vào kịch bản? Tôi không có quyền xem xét nó. – NMan

+2

chắc chắn: 'BEGIN GIAO DỊCH; XÓA TỪ ParentTable WHERE ID =?; ROLLBACK; ' nếu bạn thấy vi phạm FK, thì việc cập nhật FK bị hạn chế. – van

+0

Đây phải là câu trả lời được chấp nhận. Tôi cảm thấy nó gần gũi nhất với câu hỏi của OP và làm như vậy một cách tốt hơn so với câu trả lời hiện đang được chấp nhận. –

1

chuyển đến Quan hệ khóa nước ngoài của mỗi bảng con và trên Chèn và Cập nhật đặc điểm kỹ thuật thay đổi xóa và cập nhật quy tắc để xếp tầng. điều này có thể giúp u chút

+0

Không biết lý do tại sao điều này đã được downvoted - điều này không chính xác những điều tương tự như câu trả lời với số phiếu cao nhất, chỉ trong giao diện người dùng và không phải với SQL! –

6

Nếu bạn muốn thiết lập các quy tắc Cascade đồ họa thì Đặt Cascade Rule trên SQL Management Studio

  1. mở bảng ở chế độ thiết kế
  2. Click vào nút Mối quan hệ từ thanh công cụ trên
  3. Chọn các quan hệ FK yêu cầu (từng cái một)
  4. Bên phải - Mở rộng INSERT hoặc CẬP NHẬT Đặc điểm kỹ thuật
  5. Thay đổi quy tắc UPDATE thành - Cascade

Đóng và Lưu, Xong!

(Đã thử trên SQL 2008)

+1

BẠN LÀ NGƯỜI !!! –

4

Như Tôi không quá tự tin vô hiệu hóa chế FK, tôi thích quá:

  1. Duplicate hàng với PK cũ với một với PK mới
  2. nhật FKS
  3. Xóa hàng với PK cũ

Ưu điểm: Không hạn chế vi phạm Dur ing quá trình.

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