如何在表 B 中插入多行,并使用新 ID 更新表 A 的空外键?



我在StackOverflow上发现了一百万听起来有点相似的东西,但不是我的情况。我将尽可能地简化:

我有如下两张表:

CREATE TABLE B (id uuid PRIMARY KEY);
CREATE TABLE A (id uuid PRIMARY KEY, b_id uuid REFERENCES b);

A.b_id中有一些NULL的值。我正在尝试创建一个执行以下操作的迁移:

对于A中没有b_id的每一行,在B中新建一行,并将id赋值给A.b_id

我如何在一个查询中完成这个?

假设您希望b中每一行都有一个不同的条目,而a中缺少UUID:

WITH upd AS (
UPDATE a
SET    b_id = gen_random_uuid()
WHERE  b_id IS NULL
RETURNING b_id
)
INSERT INTO b (id)
SELECT b_id FROM upd;

db<此处小提琴>

这个可以工作,因为它是一个单个命令,并且FK引用仅在命令末尾强制执行。

:

  • SET CONSTRAINTS ALL DEFERRED不按预期工作
  • 约束定义的DEFERRED最初的IMMEDIATE仍然被延迟?

最新更新