使用从其他 table 上的插入返回的 ID 更新 table

Update table with returned id from insert on other table

我想弄清楚如何将表 1 中的数据插入表 2,然后使用表 2 中新创建的 ID 来更新表 1 中的相应行。

我使用 Postgres 12.4 是为了它的价值

示例: 我有两个 tables,例如usersmetadata

用户 tables 有以下列

| id | info | metadata_id |

元数据table有以下列

| id | data |

我想将我的所有 info 值从 users table 迁移到 metadata table 的 data 列,并使用相应的 metadata.id 值更新我的 users.metadata_id(当前为空白),本质上是回填外键。

有什么办法可以优雅地完成这个任务吗?我有一个有效的查询,它锁定了 table 并创建了一个临时序列以插入 metadata.idusers.metadata_id 但这看起来很脆弱,我需要在元数据中存在的最高 ID table,这并不理想。

我也曾尝试使用带有 RETURNING 子句的数据修改 CTE 来更新 users table,但无法正常工作。

你不能在这里使用returning,因为你需要在插入时跟踪用户和元数据的关联。

我认为首先 pre-generate CTE 中每个用户的元数据序列更简单,使用 nextval()。然后,您可以使用该信息插入元数据并更新用户 table:

with 
    candidates as (
        select u.*, nextval(pg_get_serial_sequence('metadata', 'id')) new_metadata_id
        from users u
    ),
    inserted as (
        insert into metadata (id, data) overriding system value
        select new_metadata_id, info from candidates
    )
update users u
set metadata_id = c.new_metadata_id
from candidates c
where c.id = u.id   

我们需要 insert 语句中的 overriding system value 子句,以便 Postgres 允许我们写入 serial 列。

Demo on DB Fiddle