【问题标题】:PostgreSQL multi INSERT...RETURNING with multiple columnsPostgreSQL multi INSERT...RETURNING 多列
【发布时间】:2014-05-11 14:11:04
【问题描述】:

我正在构建一个以 Postgres 9.3 作为后端的数据库,有 3 个表:

table1 (user_id, username, name, surname, emp_date)
table2 (pass_id, user_id, password)
table3 (user_dt_id, user_id, adress, city, phone)

可以看出table2table3table1 的子表。
我可以提取table1(父级)中新插入行的user_id

INSERT INTO "table1" (default,'johnee','john','smith',default) RETURNING userid;

我需要将新提取的 id(来自 table1)插入到 user_idtable2table3 列以及这些表独有的其他数据中。基本上 3 X INSERT ...
我该怎么做?

【问题讨论】:

标签: sql postgresql insert common-table-expression


【解决方案1】:

使用data-modifying CTEs 链接您的三个INSERT。像这样的:

WITH ins1 AS (
   INSERT INTO table1 (username, name,  surname)
   VALUES ('johnee','john','smith')
   RETURNING user_id
   )
, ins2 AS (
   INSERT INTO table2 (user_id, password)
   SELECT ins1.user_id, 'secret'
   FROM   ins1                            -- nothing to return here
   )
INSERT INTO table3 (user_id, adress, city, phone)
SELECT ins1.user_id, ...
FROM   ins1
RETURNING user_id;
  • 通常最好为INSERTs 添加一个列定义列表(特殊情况除外)。否则,如果表结构发生变化,您的代码可能会以令人惊讶的方式中断。

  • 我省略了您可以输入 DEFAULT 的列。默认值会自动插入。更短,结果相同。

  • 最终的可选RETURNING 返回结果user_id - 显然来自序列或其他默认值。它实际上是来自table3user_id,但除非你有一些触发器或其他魔法干扰,否则它是一样的。

有关数据修改(也称为“可写”)CTE 的更多信息:

【讨论】:

  • 谢谢,这正是我要找的......也很容易解释,我认为这些可以以同样的方式嵌套用于任何操作(删除、更新......),也最后一次返回不需要,...无论如何,准确且可以理解...
【解决方案2】:

使用函数插入主从细节

CREATE OR REPLACE FUNCTION apps.usp_bazar_list_insert_1(
    ip_userid character varying,
    ip_mobileno character varying,
    ip_bazarlisttext text,
    data_details text)
    RETURNS TABLE(id integer) 
    LANGUAGE 'plpgsql'

    COST 100
    VOLATILE 
    ROWS 1000
    
AS $BODY$
DECLARE master_id integer;
BEGIN
insert into apps.bazar_list(action_by,mobile_no,bazarlisttext,action_date) 
select ip_userId,ip_mobileNo,ip_bazarListText,now() returning list_id into master_id;

insert into apps.bazar_list_images(list_id,action_date,image_name) 
select master_id,now(),image_name from json_populate_recordset(NULL::apps.bazar_list_images, 
                                   data_details::json);
RETURN QUERY
        select 1;
    
END;
$BODY$;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 2018-08-18
    • 2015-06-18
    • 2017-05-06
    • 2016-09-10
    • 2021-11-13
    相关资源
    最近更新 更多