node.js - Postgres 将行的多个返回值插入到表中

标签 node.js postgresql

我想将多 (2) 行插入到 Postgres 中的表中,并使用 WITH ROWS AS 返回的 ids 插入到另一个表(列 id_1second_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/

相关文章:

regex - 有没有办法有效地索引包含正则表达式模式的文本列?

postgresql - Docker dpage/pgadmin4错误:指定的用户不存在

node.js - 为什么使用 Node.js 时在 localhost 上看不到结果?

node.js - NodeJs 中的静态文件夹

javascript - express.static() 不路由静态文件

sql - 如何在包含 json 数据的 postgresql 列中找到最小值?

sql - 高效的 SQL 表合并和分页

使用 Webpack 的 Javascript 模块

sql - 按时间范围删除数据存储中的行

sql - Postgres 获取具有不同值的下一行