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