25

任何人都可以对这些功能的作用以及何时使用它们提供清晰的解释/示例吗?

4

4 回答 4

32

直接从说明书...

我们知道外键不允许创建与任何产品无关的订单。但是,如果在创建引用该产品的订单后删除该产品怎么办?SQL 也允许您处理它。直观地说,我们有几个选择:

禁止删除引用的产品

也删除订单

还有什么?

CREATE TABLE order_items (
 product_no integer REFERENCES products ON DELETE RESTRICT,
 order_id integer REFERENCES orders ON DELETE CASCADE,
 quantity integer,
 PRIMARY KEY (product_no, order_id)
);

限制和级联删除是两个最常见的选项。RESTRICT 防止删除引用的行。NO ACTION 表示如果在检查约束时仍然存在任何引用行,则会引发错误;如果您不指定任何内容,这是默认行为。(这两种选择之间的本质区别在于 NO ACTION 允许将检查推迟到事务的后期,而 RESTRICT 不允许。) CASCADE 指定当一个引用的行被删除时,引用它的行应该被自动删除也是。还有两个其他选项:SET NULL 和 SET DEFAULT。当引用的行被删除时,这些会导致引用列分别设置为空值或默认值。请注意,这些并不能成为您遵守任何约束的借口。例如,

与 ON DELETE 类似,还有一个 ON UPDATE,它在引用的列被更改(更新)时被调用。可能的动作是一样的。

编辑:您可能想看看这个相关问题:When/Why to use Cascading in SQL Server? . 问题/答案背后的概念是相同的。

于 2008-10-22T14:11:53.127 回答
0

我有一个 PostGreSQL 数据库,当我有一个从数据库中删除的用户并且我需要从其他表中删除它的信息时,我使用 On Delete。这种方式我只需要执行 1 次删除,具有 ON 删除功能的 FK 将从其他表中删除信息。

您可以对 ON Update 执行相同操作。如果您更新表并且该字段具有 On Update 的 FK,如果在 FK 上进行了更改,您将在 FK 表上注意到。

于 2008-10-22T14:15:27.830 回答
0

Daok 说的是真的……它可以相当方便。另一方面,让事情在数据库中自动发生可能是一个真正的问题,尤其是在消除数据时。将来有人可能会指望 FK 通常会在有孩子时阻止删除父母这一事实,而没有意识到您使用 On Delete Cascade 不仅不能阻止删除,它还​​会在几十个中生成大量数据由于级联删除的瀑布,其他表消失了。

@Arthur 的评论。

数据库中“隐藏”的事情发生得越频繁,任何人就越不可能很好地掌握正在发生的事情。触发器(这本质上是一个触发器)可以导致我删除一行的简单操作,在整个数据库中产生广泛的后果。我发出一条 Delete 语句,17 个表受到级联触发器和约束的影响,而对于命令的发出者来说,这一切都不是显而易见的。OTOH,如果我将删除父项及其所有子项放在一个过程中,那么任何人都可以非常容易和清楚地看到当我发出命令时会发生什么。

这与我设计数据库的好坏完全无关。它与触发器引入的操作问题有关。

于 2008-10-22T14:48:16.093 回答
0

您可以简单地编写一条警告消息,而不是编写级联删除或级联更新的所有工作的方法。比重新发明轮子容易得多,而且它让客户(以及新开发人员拿起代码)清楚

于 2010-07-08T09:27:06.500 回答