首页 > 解决方案 > Node & SQL:复杂的插入 vs sql 函数

问题描述

我正在设计 node + postgres web 服务,我需要对 3 个表进行 3 次插入。我应该在节点后端代码中执行 3 个单独的插入查询,还是实现 postresql 函数。

例子:

    insert into users(id, name, address) values (1, 'username', 'address') returning id as userid;
    insert into company(id, contactPersonId, name) values (11, 1, 'Companyname) returning id as companyid;
    insert into report(id, userid, companyid) values (111,1,11);

或者有一个功能:

create or replace function add_report_details(userid, username, address, companyid, companyname, reportid)
    ....
    insert into users(id, name, address) values (1, 'username', 'address') returning id as userid;
    insert into company(id, contactPersonId, name) values (11, 1, 'Companyname') returning id as companyid;
    insert into report(id, userid, companyid) values (111,1,11);
    ....

用函数实现这个似乎是更好的选择,因为这样我就不必在表结构发生变化或我想实现一些附加功能时将插入查询更改为代码中的多个位置。

使用函数是否还有其他好处,或者是否有其他方法来处理这个问题?

编辑:我从中得出的结论是,为了可读性和可维护性,最好将插入查询保留在 js 函数中。然而,更复杂的解决方案可能与数据库有更多的关系,因此在这种情况下,函数/过程可能是首选方法。

如果您决定使用函数,还需要考虑以下几点:如何使用 postgresql 中的存储过程将数据插入表中

如果您对在代码中的查询上使用 sql 函数有任何其他建议或意见,请在下面发表评论。我觉得这是很常见的问题,或者我不知道限制/最佳实践。

感谢您的回答和反馈!

标签: node.jspostgresql

解决方案


您可以使用 CTE 进行单个查询:

WITH s1 AS (
    insert into users(id, name, address) values (1, 'username', 'address') 
    returning id as userid
), s2 AS (
    insert into company(id, contactPersonId, name) 
    SELECT 11
        , userid
        , 'Companyname') 
    FROM s1
    returning id as companyid, userid
)
insert into report(id, userid, companyid) 
SELECT 111
    , userid
    , companyid
FROM s2;

(未测试)


推荐阅读