【发布时间】:2022-08-02 15:43:06
【问题描述】:
我正在努力理解 DEFERRED 约束在 postgres 中的工作方式(如果重要,v13)。
我有以下架构和数据:
CREATE TEMP TABLE t1 (
id int,
CONSTRAINT unique_id PRIMARY KEY (id)
);
CREATE TEMP TABLE t2 (
id int,
ref int,
CONSTRAINT fk FOREIGN KEY (ref) REFERENCES t1 (id) ON DELETE SET NULL DEFERRABLE INITIALLY IMMEDIATE
);
INSERT INTO t1 VALUES (1);
INSERT INTO t2 (id,ref) VALUES (1,1);
然后我执行以下指令:
BEGIN;
SET CONSTRAINTS ALL DEFERRED;
DELETE FROM t1;
INSERT INTO t1 VALUES (1);
COMMIT;
因为约束被延迟,我希望 ON DELETE SET NULL 在事务结束时触发并保留从t1 到t2 的链接。然而事实并非如此。
SELECT * FROM t2;
id | ref
----+-----
1 |
(1 row)
我在这里想念什么?
标签: postgresql