2011-09-27 38 views
5

Ràng buộc khoá ngoại có được kiểm tra trên câu lệnh cập nhật SQL không cập nhật các cột có ràng buộc không? (Trong MS SQL Server)Ràng buộc khoá ngoại có được kiểm tra trên câu lệnh cập nhật SQL không cập nhật các cột có ràng buộc không?

Nói rằng tôi có một vài bảng với các cột sau:

OrderItems 

    - OrderItemID 
    - OrderItemTypeID (FK to a OrderItemTypeID column on another table called OrderItemTypes) 
    - ItemName 

Nếu tôi chỉ cập nhật

update [dbo].[OrderItems] 
set [ItemName] = 'Product 3' 
where [OrderItemID] = 2508 

sẽ hạn chế FK làm nó tra cứu/kiểm tra với báo cáo cập nhật ở trên? (thậm chí nghĩ rằng bản cập nhật không thay đổi giá trị của cột đó?)

+0

Mặc dù đó là câu hỏi hợp lệ, tôi tự hỏi mức độ liên quan có thể là –

+0

Nếu FK không được chọn thì sẽ có lợi ích trước khi không bao gồm cột FK trong báo cáo cập nhật. –

Trả lời

8

Không, khóa ngoại không được chọn. Điều này là khá dễ dàng để xem bằng cách kiểm tra các kế hoạch thực hiện của hai bản cập nhật khác nhau.

create table a (
    id int primary key 
) 

create table b (
    id int, 
    fkid int 
) 

alter table b add foreign key (fkid) references a(id) 

insert into a values (1) 
insert into a values (2) 

insert into b values (5,1) -- Seek on table a's PK 

enter image description here

update b set id = 6 where id = 5 -- No seek on table a's PK 

enter image description here

update b set fkid = 2 where id = 6 -- Seek on table a's PK 

enter image description here

drop table b 
drop table a 
+1

+1 ví dụ tuyệt vời. –

3

Không. Vì bản cập nhật SQL không cập nhật cột chứa ràng buộc, SQL Server sẽ kiểm tra chính xác trong trường hợp này? Điều này tương tự như yêu cầu, "một kích hoạt chèn có được kích hoạt nếu tôi chỉ cập nhật không?" Câu trả lời là không.

+0

Bạn có biết điều này chắc chắn hay chỉ là trực giác? Nó sẽ không làm tôi ngạc nhiên nếu nó chạy một kiểm tra cập nhật – JNK

+0

@ JNK - Nó sẽ chạy một kiểm tra trên? Cột không được cập nhật và không có giá trị để kiểm tra. Vì vậy, những gì sẽ được kiểm tra? –

+0

+1 Một thử nghiệm đơn giản cho bạn thấy đúng. Có thể được kiểm tra bằng cách kiểm tra kế hoạch thực hiện nơi bạn cập nhật cột FK và nơi bạn không có. –

1

Có một trường hợp khi FK không hiện tại sẽ ngăn chặn bản cập nhật cho cột khác s mặc dù FK không thay đổi và đó là khi FK được tạo ra với NOCHECK và do đó không được kiểm tra tại thời điểm tạo. Mỗi sách trực tuyến:

Nếu bạn không muốn xác minh CHECK mới hoặc các ràng buộc KEY NGOÀI đối với dữ liệu hiện có, hãy sử dụng WITH NOCHECK. Chúng tôi khuyên bạn không nên làm điều này, ngoại trừ trong những trường hợp hiếm hoi. Ràng buộc mới sẽ được đánh giá trong tất cả các cập nhật dữ liệu sau này. Bất kỳ vi phạm ràng buộc nào bị chặn bằng WITH NOCHECK khi ràng buộc được thêm vào có thể gây ra các cập nhật trong tương lai không thành công nếu chúng cập nhật các hàng có dữ liệu không tuân thủ ràng buộc .

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