Postgres 将数据联接到插入的生成的 ID 上

Postgres joining data onto inserted generated IDs

提问人:Max1e 提问时间:10/31/2023 最后编辑:Max1e 更新时间:10/31/2023 访问量:63

问:

在 postgres 中,我想在第一个表中插入多行,然后使用生成的身份将多行插入到第二个表中。有没有办法将返回的 ID 与我的数据联接?

我有以下代码片段,其中我首先将新的除数插入到插入的表中,然后使用这些生成的 ID 插入到除数表中。

WITH inserted AS (
    INSERT INTO transaction (transaction_date, mutation)
    SELECT transaction_date, mutation FROM new_dividends
    RETURNING transaction_id
)
INSERT INTO dividend (transaction_id, effect)
SELECT transaction_id, effect FROM inserted;

这是行不通的,因为在第二个插入中,应从new_dividends中选择效果,因为它在返回语句中不存在。

编辑:transaction_id是在事务中生成的,因此它不是从new_dividends中选择的。因此,两个结果集之间没有共同的唯一列。

postgresql sql-insert 生成的列

评论

0赞 Zegarek 10/31/2023
是的,您可以将 CTE 与任何其他表或值列表联接。使用任何您认为合适的方法。insertedjoin

答:

0赞 Zegarek 10/31/2023 #1

您从 CTE 中进行选择的事实并不妨碍您使用所需的任何联接演示

WITH inserted AS (
    INSERT INTO transaction (transaction_date, mutation)
    SELECT transaction_date, mutation FROM new_dividends
    RETURNING transaction_id, transaction_date, mutation
)
INSERT INTO dividend (transaction_id, effect)
SELECT transaction_id, effect FROM inserted NATURAL JOIN new_dividends;
table "transaction";
transaction_id transaction_date 突变
59B0F892-9C7B-4D00-B2C0-736169290221 2023-10-31 15:15:46.863376+00 突变1
table new_dividends;
transaction_date 突变 影响
2023-10-31 15:15:46.863376+00 突变1 效果1
table dividend;
transaction_id 影响
59B0F892-9C7B-4D00-B2C0-736169290221 效果1

评论

0赞 Zegarek 10/31/2023
通常应该为表添加别名,并指定哪一列来自哪一列。有了 ,它很清楚并共享 a,所以它们都有该列不会造成冲突,而且你已经说过不存在 - 所以也很清楚它应该来自 .如果它们有更多共同的列,则可能需要切换到常规列或具有显式联接条件的列。natural joininsertednew_dividendstransaction_ideffectinsertednew_dividendsinnerleft join
0赞 Max1e 10/31/2023
我看到我在代码片段中犯了一个错误。Transaction_id 在 new_dividends 中不存在,因为它是在事务中生成的。所以我没有连接条件,因为结果集没有公共列。这样的事情还有可能吗?
0赞 Zegarek 10/31/2023
当然,这是有道理的。不过,这没什么区别:您可以返回共享的两列及其上的 CTE。我已经更新了其中的答案和演示链接natural joininserted