【发布时间】:2009-07-16 12:45:01
【问题描述】:
当我们定义外键约束时,我对 SQL Server 2008 Management Studio 中的更新和删除规则的含义感到困惑。我也没有找到相关的帮助文档(例如 F1 帮助)。
这是屏幕截图。欣赏是否有人可以描述他们的意思并推荐一些相关文件以供阅读。 :-)
【问题讨论】:
标签: sql sql-server sql-server-2008 foreign-keys
当我们定义外键约束时,我对 SQL Server 2008 Management Studio 中的更新和删除规则的含义感到困惑。我也没有找到相关的帮助文档(例如 F1 帮助)。
这是屏幕截图。欣赏是否有人可以描述他们的意思并推荐一些相关文件以供阅读。 :-)
【问题讨论】:
标签: sql sql-server sql-server-2008 foreign-keys
外键定义了两个表之间的父子关系。父表中的主键是最多 n 个子表行中的外键。
现在,如果父表中的主键得到 UPDATE,则 UPDATE RULE 启动。所有子行也被更新,设置为 NULL 或其他。然而,最佳做法是拥有一个永不更改的主键(固定 ID 或其他东西),因此这是不太重要的规则。
更重要的是删除规则 - 如果父行被删除(例如订单被删除)怎么办?您也可以使用 CASCADE DELETE 删除所有子行(所有订单行项目),或者您可以将其外键设置为 NULL(它们不再有父行) - 这完全取决于您的具体情况。
在订单/订单行场景中,删除完整订单时删除订单行可能非常有用,但您可能不想删除产品,因为引用它的订单已被删除- 没有一个单一的正确答案 - 这取决于您的场景和您的应用。
马克
【讨论】:
NO ACTION 不会做任何事情 - 如果引用了子行,删除将失败
文档似乎位于Foreign Key Relationships Dialog Box。
顺便说一句,F1 帮助在 SSMS 2008 中对我来说效果很好。我直接到了上面的页面(当然是在我在线搜索 1/2 小时之后)。
【讨论】:
外键字段只能存储空值或主键字段定义的值。
如果您尝试将外键值更改为主键未定义的值,您将收到错误消息。同样,如果您尝试更改具有外键依赖项的主键,您将收到错误...例如
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 的主键
【讨论】: