SQL Server:删除具有外键约束的行:事务是否可以覆盖约束?

Mar*_*man 6 sql sql-server transactions constraints sql-server-2008

我有一些表添加了外键约束.这些与代码生成一起用于在生成的存储过程中设置特定连接.

是否可以通过调用事务中的多个删除来覆盖这些约束,特别是C#中的"TransactionScope"或者是否需要级联删除?

HLG*_*GEM 14

不要使用级联删除,这样会导致严重的性能问题.最好的过程是从最低子表到父表按顺序执行删除操作.

禁用外键是导致数据完整性问题的处方.唯一一次这样的事情应该由一位经验丰富并且充分意识到可能导致的问题的DBA来完成.如果你问这个问题,你还没有足够的经验来使用这种技术.请记住,当您禁用FK时,您可以为所有人禁用它,而不仅仅是您的进程.

  • 我不同意级联删除会导致性能问题.事实上,它们是最有效的解决方案(查看执行计划).如果你手动完成,你必须执行相同数量的工作,但效率更低. (5认同)

OMG*_*ies 7

"覆盖" 外键约束的唯一方法是禁用它:

禁用FOREIGN KEY约束可以修改表中的数据,而无需通过约束进行验证.如果新数据违反约束或者约束仅应用于数据库中已有的数据,则在INSERT和UPDATE语句期间禁用FOREIGN KEY约束.

您需要使用该ALTER TABLE命令来使用NOCHECK关键字禁用约束.IE:

ALTER TABLE dbo.cnst_example NOCHECK CONSTRAINT salary_cap;
Run Code Online (Sandbox Code Playgroud)

唯一的另一种选择是删除约束,并在必要时重新添加.

这样做的必要性应导致讨论如何对表进行建模,因此这不是必需的.