【问题标题】:SQL Server 2005 Cascading DeleteSQL Server 2005 级联删除
【发布时间】:2011-02-14 16:28:30
【问题描述】:

我不能 100% 确定级联删除的工作原理。

为了简单起见,我有这样的表格

用户 用户 ID

扩展用户 用户 ID

评论 用户ID

帖子 用户 ID

我基本上有很多表引用来自用户的 User_ID。我想在一个表上设置级联删除,以便我可以删除 User 对象并确保删除所有引用 User 的表。

但是,我的理解是我需要在每个引用 User 的表上设置删除操作。那就是我需要在每个子表上设置“级联删除”。我的理解正确吗?

SQL Server Cascading

更新: 看来我必须为每个关系设置它。我应该将这些关系视为“存储”在哪里?可能我的观念不对。

看起来我可以使用父表中的管理工作室为每个关系设置所有参照完整性规则。

【问题讨论】:

    标签: sql-server sql-server-2005


    【解决方案1】:

    对于每个关系,您可以指定要采取的操作。

    管理此问题的最简单方法可能是使用 SQL Server Management Studio。设计您的父表,并找出所有的 PK-FK 关系。

    对于每个,选择在发生 Delete 事件时采用的路径:

    • 无操作 - 这将导致 FK 错误发生时
    • 级联 - 删除子记录
    • 设置为空 - FK 列的值将为空。当子表中不允许空值时,这显然会引发错误。
    • 设置默认值 - 如果子表上的 FK 列有默认值,那么它将是子列中的新值。

    【讨论】:

    • 坎贝尔谢谢。这就是我所做的!我在想我必须检查每个子表,但我可以看到父表的关系。我想这是我的困惑。
    【解决方案2】:

    您所描述的内容似乎很糟糕(尤其是如果您不强制执行引用完整性)。考虑以下几点:

    您有 3 个引用用户表的表:Client、Employee 和 Guest

    如果我理解正确,您是说当您删除引用用户记录的客户记录时,您希望也删除该用户记录(正确吗?)。

    如果您这样做,并且有 Employee 和 Guest 记录引用相同的用户记录,那么它们将突然指向任何内容(如果您不强制引用完整性)。

    在我看来,如果您有一堆引用 User 表的表,那么您不应该进行级联删除...

    【讨论】:

    • 我很确定柯蒂斯的意思是相反的——如果您删除父记录,则子记录将被删除,反之亦然。我肯定遇到过数据库支持这种情况很好的情况。但总的来说,我同意您应该认真考虑是否启用级联删除。在代码中明确删除更安全 - 然后您必须考虑它,并且不太可能遭受不幸的数据丢失事故。
    猜你喜欢
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多