代码之家  ›  专栏  ›  技术社区  ›  Mark Redman

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

  •  6
  • Mark Redman  · 技术社区  · 15 年前

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

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

    5 回复  |  直到 15 年前
        1
  •  14
  •   HLGEM    15 年前

    不要使用cascade delete,那样会导致严重的性能问题。最好的过程是按从最低的子表到父表的顺序进行删除。

    禁用外键是解决数据完整性问题的处方。只有经验丰富、对可能导致的问题了如指掌的dba才能做到这一点。如果你问这个问题,你还没有足够的经验来使用这个技巧。记住,当您禁用fk时,您为每个人禁用它,而不仅仅是您的进程。

        2
  •  7
  •   OMG Ponies    15 年前

    唯一能“超越”A的方法 foreign key constraint 要禁用它:

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

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

    ALTER TABLE dbo.cnst_example NOCHECK CONSTRAINT salary_cap;
    

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

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

        3
  •  2
  •   Otávio Décio    15 年前

    不能覆盖FK约束,如果可以,首先创建它们的目的是什么?

        4
  •  1
  •   Philippe Grondier    15 年前

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

        5
  •  1
  •   jm7    9 年前

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