【问题标题】:Understanding Update and Delete Rules for Relationships in SSMS 2008了解 SSMS 2008 中关系的更新和删除规则
【发布时间】:2009-07-16 12:45:01
【问题描述】:

当我们定义外键约束时,我对 SQL Server 2008 Management Studio 中的更新和删除规则的含义感到困惑。我也没有找到相关的帮助文档(例如 F1 帮助)。

这是屏幕截图。欣赏是否有人可以描述他们的意思并推荐一些相关文件以供阅读。 :-)

【问题讨论】:

    标签: sql sql-server sql-server-2008 foreign-keys


    【解决方案1】:

    外键定义了两个表之间的父子关系。父表中的主键是最多 n 个子表行中的外键。

    现在,如果父表中的主键得到 UPDATE,则 UPDATE RULE 启动。所有子行也被更新,设置为 NULL 或其他。然而,最佳做法是拥有一个永不更改的主键(固定 ID 或其他东西),因此这是不太重要的规则。

    更重要的是删除规则 - 如果父行被删除(例如订单被删除)怎么办?您也可以使用 CASCADE DELETE 删除所有子行(所有订单行项目),或者您可以将其外键设置为 NULL(它们不再有父行) - 这完全取决于您的具体情况。

    在订单/订单行场景中,删除完整订单时删除订单行可能非常有用,但您可能不想删除产品,因为引用它的订单已被删除- 没有一个单一的正确答案 - 这取决于您的场景和您的应用。

    马克

    【讨论】:

    • 谢谢 Marc,我正在从这个 MSDN 页面学习,msdn.microsoft.com/en-us/library/ms186973%28SQL.90%29.aspx 一个困惑,提到“如果在目标表上也定义了级联引用操作......”,我的困惑似乎除了这四个动作(NO ACTION | CASCADE | SET NULL | SET DEFAULT),我们还可以定义一些其他的动作吗?
    • 不,您可以为 UPDATE 和 DELETE 场景定义这四个操作之一。本文讨论的是 TableB 引用 TableA 并具有“ON DELETE CASCADE”的场景,因此如果 TableA 中的一行被删除,TableB 中的所有子项也将被删除。如果在这种情况下,有一个使用 ON DELETE CASCADE 操作引用 TableB 的 TableC,则 TableA 中的此删除将转到 TableB,然后转到 TableC。
    • 谢谢马克,我喜欢你的回答!
    • 一个小插件:外键也可以引用唯一键,因此更新规则也很重要。 (级联更新,设置null等)
    • @TomerW: 是的,并且拥有NO ACTION 不会做任何事情 - 如果引用了子行,删除将失败
    【解决方案2】:

    文档似乎位于Foreign Key Relationships Dialog Box

    顺便说一句,F1 帮助在 SSMS 2008 中对我来说效果很好。我直接到了上面的页面(当然是在我在线搜索 1/2 小时之后)。

    【讨论】:

    • 谢谢约翰,不幸的是,F1 的帮助对我没有帮助。 :-(
    • 我右键单击一个表格并选择“设计”。然后我右键单击设计器并选择“关系”。然后我按 F1 并得到帮助。您使用的是什么版本的 SQL Server?
    【解决方案3】:

    外键字段只能存储空值或主键字段定义的值。

    如果您尝试将外键值更改为主键未定义的值,您将收到错误消息。同样,如果您尝试更改具有外键依赖项的主键,您将收到错误...例如

    Models table
    modelID (primary key)   model
    1                       Jeep   
    2                       Ford
    
    Customer table
    id    customer   modelID (foreign key of Models.modelID)
    1     1234       1
    2     2345       2
    

    如果您尝试从 Models 中删除 Jeep 记录,您将收到错误消息,因为客户 1234 的 modelID 设置为 1,如果外键设置为 1。同样,如果我尝试将客户 1234 更新为 modelID 为 3,则会引发错误,因为 Models 表中没有值为 3 的主键

    Check this out

    【讨论】:

    • 谢谢克里斯,但您推荐的链接没有提到SMSS中更新和删除规则的含义?它谈到了通用外键理论。
    • 这里有一个关于这些规则的谷歌图书参考books.google.com/…
    • 我们可以打印 Google 图书内容吗?我很努力,但无法打印。 :-)
    • 不幸的是,我不这么认为......因为它只是你需要付费的书中的一个样本:(试试 Aakash 发布的 MSDN 链接
    • 谢谢克里斯,我正在从这个 MSDN 页面学习,msdn.microsoft.com/en-us/library/ms186973%28SQL.90%29.aspx 一个困惑,提到“如果在目标表上也定义了级联引用操作......”,我的困惑似乎除了四个动作(NO ACTION | CASCADE | SET NULL | SET DEFAULT),我们还可以定义一些其他的动作吗?
    猜你喜欢
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 2022-11-24
    • 2017-03-11
    • 2012-03-31
    • 2015-05-29
    相关资源
    最近更新 更多