RESTRICT 和 NO ACTION 的区别
Posted
技术标签:
【中文标题】RESTRICT 和 NO ACTION 的区别【英文标题】:Difference between RESTRICT and NO ACTION 【发布时间】:2013-02-17 13:38:08 【问题描述】:来自postgresql documentation:
RESTRICT 防止删除引用的行。 NO ACTION 表示如果在检查约束时仍然存在任何引用行,则会引发错误;如果您不指定任何内容,这是默认行为。 (这两种选择的本质区别在于 NO ACTION 允许将检查延迟到交易的后期,而 RESTRICT 则不允许。)
让我们检查一下。 创建父子表:
CREATE TABLE parent (
id serial not null,
CONSTRAINT parent_pkey PRIMARY KEY (id)
);
CREATE TABLE child (
id serial not null,
parent_id serial not null,
CONSTRAINT child_pkey PRIMARY KEY (id),
CONSTRAINT parent_fk FOREIGN KEY (parent_id)
REFERENCES parent (id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
填充一些数据:
insert into parent values(1);
insert into child values(5, 1);
并且测试确实检查确实延迟:
BEGIN;
delete from parent where id = 1; -- violates foreign key constraint, execution fails
delete from child where parent_id = 1;
COMMIT;
第一次删除完整性被破坏后,第二次删除后将恢复。但是,第一次删除时执行失败。
更新相同:
BEGIN;
update parent set id = 2 where id = 1; -- same as above
update child set parent_id = 2 where parent_id = 1;
COMMIT;
在删除的情况下,我可以交换语句以使其工作,但在更新的情况下,我无法执行它们(可以通过删除两行并插入新版本来实现)。
许多数据库在 RESTRICT 和 NO ACTION 之间没有任何区别,而 postgres 则假装不这样做。它(仍然)是真的吗?
【问题讨论】:
【参考方案1】:仅当您使用INITIALLY DEFERRED
或INITIALLY IMMEDIATE
模式将约束定义为DEFERRABLE
时,才会出现差异。
见SET CONSTRAINTS
。
【讨论】:
以上是关于RESTRICT 和 NO ACTION 的区别的主要内容,如果未能解决你的问题,请参考以下文章