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

时间:2010-04-29 19:13:26

标签: sql sql-server sql-server-2008 transactions constraints

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

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

5 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:7)

“覆盖”foreign key constraint的唯一方法是禁用它:

  

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

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

ALTER TABLE dbo.cnst_example NOCHECK CONSTRAINT salary_cap;

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

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

答案 2 :(得分:2)

你不能覆盖FK约束,如果你可以在第一时间创建它们的那一点?

答案 3 :(得分:1)

如果您的FK约束是专门为存储过程中的特定用途设置的,那么这些不是 真的 FK,不是吗?一个很好的解决方案是通过在proc开始时创建约束来更新相应的代码,并在代码完成时清除它们。不要忘记处理无法根据数据检查临时约束的情况。

答案 4 :(得分:1)

约束可以设置为立即或延迟到事务结束。延迟到事务结束允许您在构建事务时违反约束,但在事务结束时强制执行它们。根据我的理解,延迟到交易结束是你可能会追求的。