postgresql 使用插入其他表时返回的ID更新表

kninwzqo  于 2023-01-25  发布在  PostgreSQL
关注(0)|答案(1)|浏览(217)

我试图弄清楚如何将Table1中的数据插入Table2,然后使用Table2中新创建的ID更新Table1中的相应行。
我使用Postgres 12.4是为了它的价值
示例:我有两个表,例如usersmetadata
用户表包含以下列

| id | info | metadata_id |

元数据表包含以下列

| id | data |

我想将所有info值从users表迁移到metadata表的data列,并用相应的metadata.id值更新users.metadata_id(当前为空),实际上就是回填外键。
有什么方法可以优雅地完成这个任务吗?我有一个工作查询,它锁定了两个表,并创建了一个临时序列插入到metadata.idusers.metadata_id中,但这似乎很脆弱,我需要从元数据表中存在的最高ID之后开始序列,这并不理想。
我还尝试过使用带有RETURNING子句的数据修改CTE来更新users表,但无法使其工作。

yeotifhr

yeotifhr1#

这里不能使用returning,因为在插入时需要跟踪用户和元数据的关联。
我认为首先使用nextval()预先生成CTE中每个用户的元数据序列会更简单,然后可以使用该信息插入元数据并更新用户表:

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列。

    • 一个

相关问题