С точки зрения одной команды, которая проверяет отношения только один раз (а не дважды в вашем примере - один раз для NOT EXISTS
, один раз для DELETE
), тогда я ожидаю, что ответ большой жирный нет .
(от идеи стены):
Если это серьезная проблема, вы можете попробовать какую-то реализацию подсчета ссылок, используя триггеры для обновления счетчика - но на самом деле я ожидаю, что это потребует гораздо больше усилий, чем простая проверка ключей, которые вы уже сделали. 1005 *
Вы также можете исследовать NOCHECK
во время удаления (так как вы проверяете это самостоятельно); но вы можете сделать это только на уровне таблицы (так что, вероятно, хорошо для сценариев администратора, но не для производственного кода) - т.е.
-- disable
alter table ChildTableName nocheck constraint ForeignKeyName
-- enable
alter table ChildTableName check constraint ForeignKeyName
Быстрый тест показывает, что с включенным он выполняет дополнительное сканирование кластерного индекса по внешнему ключу; с отключенным, это опущено.
Вот полный пример; Вы можете посмотреть на план запроса двух DELETE
операций ... (в идеале в отрыве от остальной части кода):
create table parent (id int primary key)
create table child (id int primary key, pid int)
alter table child add constraint fk_parent foreign key (pid)
references parent (id)
insert parent values (1)
insert parent values (2)
insert child values (1,1)
insert child values (2,1)
-- ******************* THIS ONE CHECKS THE FOREIGN KEY
delete from parent
where not exists (select 1 from child where pid = parent.id)
-- reset
delete from child
delete from parent
insert parent values (1)
insert parent values (2)
insert child values (1,1)
insert child values (2,1)
-- re-run with check disabled
alter table child nocheck constraint fk_parent
-- ******************* THIS ONE DOESN'T CHECK THE FOREIGN KEY
delete from parent
where not exists (select 1 from child where pid = parent.id)
-- re-enable
alter table child check constraint fk_parent
Опять же - я подчеркиваю, это должно выполняться только из таких вещей, как сценарии администратора.