【问题标题】:Inserting into multiple tables with a CTE Not working for me使用 CTE 插入多个表不适合我
【发布时间】:2020-06-19 14:45:05
【问题描述】:

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

缺少表“first_insert”位置 824 的 From 子句条目。

我的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 - 就性能和安全性而言,是否有更好的整体插入方式?

【问题讨论】:

    标签: node.js postgresql node-postgres


    【解决方案1】:

    1 - 我怎样才能让它工作,因为插入不需要从所以甚至不知道从哪里开始

    它抱怨“最终”查询,你没有 FROM 子句。应该是这样的:

    ...
    insert into image(listing_id, img_url) select id, 'imgUrl' from first_insert;
    

    2 - 就性能而言,这是执行这些类型插入的最佳方式吗?

    性能应该类似于执行 BEGIN + 4 次插入作为单独的查询 + COMMIT。它可能会稍微快一些,因为您节省了应用程序和数据库之间的网络往返,但我认为这不会对普通应用程序产生影响。我会使用任何对您来说更具可读性/可维护性的方式。

    3 - 这是否被归类为安全插入,这样如果任何一个插入失败并且已经执行的插入被回滚?

    是的,Postgres 中的查询会在它们自己的事务中自动执行(如果您还没有开始自己的事务)。这意味着它的所有效果或全部不提交到磁盘,但永远不会部分。

    4 - 就性能和安全性而言,是否有更好的整体插入方式?

    我认为没有更好的性能方法。为了安全起见,这与在事务中分别运行 4 个插入同样安全。

    为了可维护性/可读性,我想说在事务中分别进行 4 次插入会更好。它不那么深奥,更灵活。如果将来您只想在满足特定条件的情况下插入allergen 怎么办?如果您单独执行查询,添加if 非常容易,但如果您在一个大查询中完成所有查询,则变得更加复杂。

    【讨论】:

    • 完成了这项工作,在最后一个查询中缺少表格,感谢您的建议,如果我需要额外的性能,我现在决定使用类似的多插入方式我会更多地研究 CTE 表达式。
    猜你喜欢
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 2015-03-20
    • 2014-05-26
    • 2022-09-25
    • 1970-01-01
    相关资源
    最近更新 更多