Postgres 外键“更新时”和“删除时”选项如何工作?
问题:Postgres 外键“更新时”和“删除时”选项如何工作? 任何人都可以对这些功能的作用以及何时使用它们提供清晰的解释/示例吗? 解答 直接从手册... 我们知道外键不允许创建与任何产品无关的订单。但是,如果在创建引用该产品的订单后删除该产品怎么办? SQL 也允许您处理它。直观地说,我们有几个选择: 不允许删除引用的产品 也删除订单 还有什么? CREATE TABLE order_ite
问题: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?。问题/答案背后的概念是相同的。
更多推荐
所有评论(0)