任何人都可以提供这些函数的作用以及何时适合使用它们的清晰解释/示例吗?

有帮助吗?

解决方案

直接来自 手册...

我们知道外键不允许创建与任何产品无关的订单。但是,如果在创建引用某个产品的订单后删除该产品,该怎么办?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 DEFAULT 但默认值不满足外键,则操作将失败。

与 ON DELETE 类似,还有 ON UPDATE,当引用的列更改(更新)时会调用 ON UPDATE。可能的操作是相同的。

编辑: 您可能想看看这个相关问题: 何时/为何在 SQL Server 中使用级联?. 。问题/答案背后的概念是相同的。

其他提示

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

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

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

@Arthur的评论。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top