Postgres外键'on update'和'on delete'选项如何工作?

mel*_*yal 22 sql postgresql database-design cascade foreign-keys

任何人都可以提供这些功能的明确解释/示例,以及何时使用它们?

mat*_*t b 28

直接从手册 ......

我们知道外键不允许创建与任何产品无关的订单.但是,如果在创建引用它的订单后删除了产品,该怎么办?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)
);
Run Code Online (Sandbox Code Playgroud)

限制和级联删除是两种最常见的选项.RESTRICT可防止删除引用的行.NO ACTION表示如果在检查约束时仍存在任何引用行,则会引发错误; 如果您未指定任何内容,则这是默认行为.(这两个选项之间的本质区别在于NO ACTION允许将检查延迟到事务的后期,而RESTRICT则不会.​​)CASCADE指定当删除引用的行时,应自动删除引用它的行同样.还有另外两个选项:SET NULL和SET DEFAULT.这些导致引用列分别在删除引用行时设置为空值或默认值.请注意,这些不能免除您观察任何约束.例如,

类似于ON DELETE,还有ON UPDATE,当引用的列被更改(更新)时调用.可能的行动是相同的.

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