我想将多 (2) 行插入到 Postgres 中的表中,并使用 WITH ROWS AS
返回的 ids 插入到另一个表(列 id_1
和second_table
中的id_2
),并返回那个 id 作为查询的最终结果。
first_table
是主要的数据集合,second_table
本质上只是将两个 first_table
条目链接在一起。
这是我正在尝试做的事情的要点:
WITH row AS (
INSERT INTO first_table (some_data, more_data)
VALUES (DEFAULT, DEFAULT), (DEFAULT, DEFAULT)
RETURNING first_table_id
)
INSERT INTO second_table (id_1, id_2, other_data)
VALUES (???, ???, DEFAULT)
RETURNING second_table_id
我正在使用 Node.js 和 node-pg
模块;我知道这可以在 Node.js 中完成,方法是让第一个查询返回 WITH ROWS AS
返回的两行,然后使用两个 id 为下一个插入运行另一个准备好的语句。
我不确定是否可以通过触发器执行此操作,因为 ON INSERT
只有一行。也许它会有两行,因为这些行在同一事务中插入到 first_table
中,但我一般没有丰富的 Postgres/SQL 经验,所以我不确定如何通过触发器。
我遇到的问题是 WITH ROWS AS
语句返回 2 行(显然是有意的),但我不知道如何在下一次插入时独立访问每一行,我觉得这是不可能的。
这可以在单个查询中完成,还是我必须为此使用触发器或 Node.js?
最佳答案
第二个插入需要是 INSERT INTO ... SELECT ... FROM first_cte
。如果您可以假设,第二个生成的 id 大于第一个(或者至少,不同且可比较——如果您使用 PostgreSQL 的 serial
,或者直接使用序列,就是这种情况) ,你可以使用聚合:
WITH rows AS (
INSERT INTO first_table (some_data, more_data)
VALUES (DEFAULT, DEFAULT), (DEFAULT, DEFAULT)
RETURNING first_table_id
)
INSERT INTO second_table (id_1, id_2)
SELECT min(first_table_id), max(first_table_id)
FROM rows
RETURNING second_table_id
请注意,other_data
被省略:您不能在 INSERT INTO ... SELECT ...
中使用 DEFAULT
。
对于更通用的解决方案,您可以使用数组:
WITH rows AS (
INSERT INTO first_table (some_data, more_data)
VALUES (DEFAULT, DEFAULT), (DEFAULT, DEFAULT)
RETURNING first_table_id
)
INSERT INTO second_table (id_1, id_2, other_data)
SELECT first_table_ids[1], first_table_ids[2], 5 -- value '5' for "other_data"
FROM (
SELECT array_agg(first_table_id) AS first_table_ids
FROM rows
) AS rows_as_array
RETURNING second_table_id
关于node.js - Postgres 将行的多个返回值插入到表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28413856/