【问题标题】:How to use results from first query in later queries within a DB Transaction如何在数据库事务中的后续查询中使用第一个查询的结果
【发布时间】:2021-12-31 20:52:28
【问题描述】:

数据库事务的一个常见情况是对多个表执行操作,因为如果一个操作失败,您可以轻松地回滚所有操作。但是,我遇到的一个常见场景是希望将记录插入到多个表中,其中后面的插入需要前面插入的序列 ID。

由于在事务实际提交之前 ID 不会生成/可用,如何才能做到这一点?如果您必须在第一次插入之后提交才能获取 ID,然后执行第二次插入,这似乎首先违背了事务的目的,因为在提交之后(或者如果我根本不使用事务) 如果第二个插入失败,我无法回滚第一个插入。

这似乎是数据库事务的常见用例,我无法想象它不会以某种方式得到支持。这如何实现?

【问题讨论】:

  • 通常情况下,生成的ID在插入后可用,而不是在提交后可用。您使用的是哪个数据库?

标签: database postgresql go transactions


【解决方案1】:

带有数据修改语句的 cte(通用表表达式) 应该可以满足您的需求,请参阅manual

典型例子:

WITH cte AS (INSERT INTO table_A (id) VALUES ... RETURNING id)
INSERT INTO table_B (id) SELECT id FROM cte

查看dbfiddle中的演示

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 2017-10-03
    • 2015-03-16
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    相关资源
    最近更新 更多