Проверяются ли ограничения внешнего ключа на операторе обновления SQL, который не обновляет столбцы с Ограничением? - PullRequest
5 голосов
/ 27 сентября 2011

Проверяются ли ограничения внешнего ключа на операторе обновления SQL, который не обновляет столбцы с Ограничением? (В MS SQL Server)

Допустим, у меня есть несколько таблиц со следующими столбцами:

OrderItems

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

Если я просто обновлю

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

Будет ли ограничение FK выполнять поиск / проверку с помощью оператора обновления выше? (даже думал, что обновление не изменит значение этого столбца?)

Ответы [ 3 ]

8 голосов
/ 27 сентября 2011

Нет, внешний ключ не проверяется.Это довольно легко увидеть, изучив планы выполнения двух разных обновлений.

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
3 голосов
/ 27 сентября 2011

Нет.Поскольку обновление SQL не обновляет столбец, содержащий ограничение, что именно SQL Server будет проверять в этом случае?Это похоже на вопрос "срабатывает ли триггер вставки, если я делаю только обновление?"Ответ - нет.

1 голос
/ 27 сентября 2011

Существует случай, когда FK, не существующий, будет препятствовать обновлению других столбцов, даже если FK не изменен, и это когда FK создается с помощью NOCHECK и, следовательно, не проверяется во время создания.Per Books Online:

Если вы не хотите проверять новые ограничения CHECK или FOREIGN KEY для существующих данных, используйте WITH NOCHECK.Мы не рекомендуем делать это, за исключением редких случаев.Новое ограничение будет оцениваться во всех последующих обновлениях данных.Любые нарушения ограничений, которые подавляются WITH NOCHECK при добавлении ограничения, могут привести к сбою будущих обновлений, если они обновляют строки данными, которые не соответствуют ограничению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...