RESTRICT和NO ACTION之间的区别

Jer*_*iho 26 sql postgresql postgresql-9.2

postgresql文档:

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
);
Run Code Online (Sandbox Code Playgroud)

填充一些数据:

insert into parent values(1);
insert into child values(5, 1);
Run Code Online (Sandbox Code Playgroud)

并且测试确实被检查了:

BEGIN;
delete from parent where id = 1; -- violates foreign key constraint, execution fails
delete from child where parent_id = 1;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

在第一次删除完整性被破坏后,但在第二次之后它将被恢复.但是,首次删除时执行失败.

更新相同:

BEGIN;
update parent set id = 2 where id = 1; -- same as above
update child set parent_id = 2 where parent_id = 1;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

在删除的情况下,我可以交换语句以使其工作,但是在更新的情况下我不能这样做(通过删除两行并插入新版本可以实现).

许多数据库在RESTRICT和NO ACTION之间没有任何区别,而postgres假装不这样做.它(仍然)是真的吗?

Cra*_*ger 25

只有在DEFERRABLE使用INITIALLY DEFERREDINITIALLY IMMEDIATE模式定义约束时才会出现差异.

SET CONSTRAINTS.