问题:Postgres 外键“更新时”和“删除时”选项如何工作?

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

解答

直接从手册...

我们知道外键不允许创建与任何产品无关的订单。但是,如果在创建引用该产品的订单后删除该产品怎么办? 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。当引用的行被删除时,这些会导致引用列分别设置为空值或默认值。请注意,这些并不能成为您遵守任何约束的借口。例如,如果一个操作指定了 SET DEFAULT 但默认值不满足外键,则操作将失败。

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

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

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐