【问题标题】:How to run dependant query in PostgreSQL transaction如何在 PostgreSQL 事务中运行依赖查询
【发布时间】:2021-07-21 05:53:11
【问题描述】:

我是一个 postgres 事务,我想在两个表中分别插入 1 条记录,比如 A 和 B, B 在同一个事务中对插入到 A 的记录有一个外键。

如何在此处引用插入的记录,以便可以在表 B 上插入

【问题讨论】:

  • 开始事务,插入A并记住新的记录id,然后用它插入B,提交事务

标签: sql postgresql


【解决方案1】:

您没有指定实际的表结构,所以我必须编造一些东西,但是可以在一个语句中使用 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;

第一个解决方案适用于任何“生成策略”,不仅适用于 identityserial 列,还适用于例如使用gen_random_uuuid() 作为默认值。

第二种解决方案需要identity 或旧的serial 类型列。

【讨论】:

  • 在第一个代码中是 select 100,...values ( 100...)
  • 第一个insert是values,但是你需要在第二部分使用select 来获取上一个insert返回的生成值
猜你喜欢
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多