Node.js 在CTE不适用于我的情况下插入多个表

Node.js 在CTE不适用于我的情况下插入多个表,node.js,postgresql,node-postgres,Node.js,Postgresql,Node Postgres,我在这里看到了一些常见的CTE用例插入到多个表中的答案,当尝试执行相同的步骤时,我最终出现了一个错误 表“第一次插入”位置824的子句条目中缺少 我的CTE表达式如下: with first_insert as ( insert into listing (title, slug, price, min_quantity, serves, currency_name, currency_symbol, img_url, description,

我在这里看到了一些常见的CTE用例插入到多个表中的答案,当尝试执行相同的步骤时,我最终出现了一个错误

表“第一次插入”位置824的子句条目中缺少

我的CTE表达式如下:

with first_insert as (
    insert into listing (title, slug, price, min_quantity, serves, currency_name, currency_symbol, img_url, description,
                         location, g_map_address, vendor_id)
        values ('hello', 'hello-1234', 1, 12, 10, 'eur', '€','url.jpg',
                'description', point(24.5498, 16.26), 'gmap', 1)
        RETURNING id
),
     second_insert as (
         insert into category (name, suggested_name, link, rel_link, listing_id)
             select 'name', 'name', 'link', 'rel_link', id
             from first_insert
     ),
     third_insert as (
         insert into allergen (name, suggested_name, link, rel_link, listing_id)
             select 'name', 'name', 'link', 'rel_link', id
             from first_insert
     )
insert into image(listing_id, img_url) select first_insert.id, 'imgUrl';
1-我如何才能让它工作,因为插入不需要从哪里开始,所以不确定从哪里开始

2-这是执行这些类型插入的最佳性能方式吗

3-是否将其归类为安全插入,以便在任何一个插入失败时,可以回滚已执行的插入

4-在性能和安全性方面,是否有更好的整体方法进行此类插入

1-我如何才能让它工作,因为插入不需要从哪里开始,所以不确定从哪里开始

它在抱怨“final”查询,因为其中没有FROM子句。应该是这样的:

。。。
插入图像(列表id,img\u url)从第一次插入中选择id“imgUrl”;
2-这是执行这些类型插入的最佳性能方式吗

性能应该类似于BEGIN+4个插入作为单独的查询+提交。它可能会稍微快一点,因为您正在保存应用程序和数据库之间的网络往返,但我认为这不会对普通应用程序产生影响。我会用你觉得更容易阅读/维护的任何方式

3-是否将其归类为安全插入,以便在任何一个插入失败时,可以回滚已执行的插入

是的,Postgres中的查询会在其自己的事务中自动执行(如果您尚未启动自己的事务)。这意味着它的所有效果都会被提交到磁盘上,或者根本不会被提交到磁盘上,但决不会被分离

4-在性能和安全性方面,是否有更好的整体方法进行此类插入

我认为没有比这更好的表演方式了。为了安全起见,这与在事务中单独运行4个插入同样安全


对于可维护性/可读性,我认为在一个事务中分别进行4次插入更好。它不那么深奥,更灵活。如果将来仅在满足特定条件时才想插入过敏原,该怎么办?如果您单独进行查询,则添加
If
非常容易,但如果您在一个大查询中进行所有查询,则会变得更加复杂。

完成了任务,上次查询中缺少表单,感谢您的建议,我决定现在使用类似的多插入方式,如果我需要额外的性能,我会仔细研究CTE表达式。