Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为什么在使用“with”时会延迟“not deliverable”约束?_Sql_Postgresql - Fatal编程技术网

Sql 为什么在使用“with”时会延迟“not deliverable”约束?

Sql 为什么在使用“with”时会延迟“not deliverable”约束?,sql,postgresql,Sql,Postgresql,当此脚本在PostgreSQL中运行时,为什么语句1和2可以工作,并且只有语句3给出错误,即使这两个外键约束都显式不可延迟?根据不可延迟,为每行检查唯一约束,与标准规范相反,它们仅在声明末尾进行检查 当唯一或主键约束不可延迟时,PostgreSQL会在插入或修改行时立即检查唯一性。SQL标准规定,唯一性只应在语句末尾强制执行 但是标准规范的这个例外只是为了唯一性,而不是外键。如果外键约束不可延迟或可延迟但不延迟,则在语句末尾检查它们。由于在前两个示例中,任何问题在语句结束时都已解决,因此没有错误

当此脚本在PostgreSQL中运行时,为什么语句1和2可以工作,并且只有语句3给出错误,即使这两个外键约束都显式不可延迟?

根据不可延迟,为每行检查唯一约束,与标准规范相反,它们仅在声明末尾进行检查

当唯一或主键约束不可延迟时,PostgreSQL会在插入或修改行时立即检查唯一性。SQL标准规定,唯一性只应在语句末尾强制执行

但是标准规范的这个例外只是为了唯一性,而不是外键。如果外键约束不可延迟或可延迟但不延迟,则在语句末尾检查它们。由于在前两个示例中,任何问题在语句结束时都已解决,因此没有错误。

根据不可延迟原则,检查每行的唯一约束,这与仅在语句结束时检查的标准规范相反

当唯一或主键约束不可延迟时,PostgreSQL会在插入或修改行时立即检查唯一性。SQL标准规定,唯一性只应在语句末尾强制执行

但是标准规范的这个例外只是为了唯一性,而不是外键。如果外键约束不可延迟或可延迟但不延迟,则在语句末尾检查它们。由于在前两个示例中的语句结束时,任何问题都已解决,因此没有错误

create table T1 (
    id bigint NOT NULL primary key,
    a bigint unique not null
);
create table T2 (
    id int not null primary key,
    b bigint,
    foreign KEY(id) references T1(id) not deferrable
);
alter table T1 add constraint fk_id foreign key (id) references T2(id) not deferrable;    

--Statement 1
with ins as (
        insert into T1(id, a) values(15, 4) returning id
)
insert into T2(id, b) values(15, 3);

--Statement 2
with ins as (
        insert into T2(id, b) values(14, 4) returning id
)
insert into T1(id, a) values(14, 3);

--Statement 3 (gives error)
with upd as (
        update T1 set a = 4 where id = 14 returning id
)
update T1 set a = 3 where id = 15;