【发布时间】:2021-07-21 05:53:11
【问题描述】:
我是一个 postgres 事务,我想在两个表中分别插入 1 条记录,比如 A 和 B, B 在同一个事务中对插入到 A 的记录有一个外键。
如何在此处引用插入的记录,以便可以在表 B 上插入
【问题讨论】:
-
开始事务,插入A并记住新的记录id,然后用它插入B,提交事务
标签: sql postgresql
我是一个 postgres 事务,我想在两个表中分别插入 1 条记录,比如 A 和 B, B 在同一个事务中对插入到 A 的记录有一个外键。
如何在此处引用插入的记录,以便可以在表 B 上插入
【问题讨论】:
标签: sql postgresql
您没有指定实际的表结构,所以我必须编造一些东西,但是可以在一个语句中使用 data modifying CTE 来做到这一点
with new_a_row as (
insert into a (col1, col2, col3)
values ('one', 'two', 42)
returning id --<<< this is the generated primary key of the table A
)
insert into b (b_col_one, b_col_two, fk_col_to_a)
select 100, 'something', id
from new_a_row;
或者使用lastval() 并在两个语句中执行此操作
begin;
insert into a (col1, col2, col3)
values ('one', 'two', 42);
insert into b (b_col_one, b_col_two, fk_col_to_a)
values (100, 'something', lastval());
commit;
第一个解决方案适用于任何“生成策略”,不仅适用于 identity 或 serial 列,还适用于例如使用gen_random_uuuid() 作为默认值。
第二种解决方案需要identity 或旧的serial 类型列。
【讨论】:
select 100,... 或 values ( 100...)
values,但是你需要在第二部分使用select 来获取上一个insert返回的生成值