使用从其他 table 上的插入返回的 ID 更新 table
Update table with returned id from insert on other table
我想弄清楚如何将表 1 中的数据插入表 2,然后使用表 2 中新创建的 ID 来更新表 1 中的相应行。
我使用 Postgres 12.4 是为了它的价值
示例:
我有两个 tables,例如users
和 metadata
用户 tables 有以下列
| id | info | metadata_id |
元数据table有以下列
| id | data |
我想将我的所有 info
值从 users
table 迁移到 metadata
table 的 data
列,并使用相应的 metadata.id
值更新我的 users.metadata_id
(当前为空白),本质上是回填外键。
有什么办法可以优雅地完成这个任务吗?我有一个有效的查询,它锁定了 table 并创建了一个临时序列以插入 metadata.id
和 users.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
列。
我想弄清楚如何将表 1 中的数据插入表 2,然后使用表 2 中新创建的 ID 来更新表 1 中的相应行。
我使用 Postgres 12.4 是为了它的价值
示例:
我有两个 tables,例如users
和 metadata
用户 tables 有以下列
| id | info | metadata_id |
元数据table有以下列
| id | data |
我想将我的所有 info
值从 users
table 迁移到 metadata
table 的 data
列,并使用相应的 metadata.id
值更新我的 users.metadata_id
(当前为空白),本质上是回填外键。
有什么办法可以优雅地完成这个任务吗?我有一个有效的查询,它锁定了 table 并创建了一个临时序列以插入 metadata.id
和 users.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
列。