PostgreSQL多INSERT ...返回多列

时间:2014-04-01 01:16:12

标签: sql postgresql insert common-table-expression

我正在使用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的子表 我可以在user_id(父级)中提取新插入行的table1

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

我需要将新提取的ID(来自table1)插入user_idtable2的{​​{1}}列以及这些表的唯一数据。基本上3 X INSERT ...
我该怎么做?

2 个答案:

答案 0 :(得分:4)

使用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;
  • 建议始终为INSERT添加列定义列表(ad-hoc代码除外)。否则,如果表结构发生变化,您的代码可能会以令人惊讶的方式中断。

  • 我省略了列定义列表中您只需输入DEFAULT的列。默认值自动应用。更短,相同的结果。

  • 如果您希望返回结果RETURNING,那么最后的user_id是可选的(显然来自序列或其他默认值。它实际上从{{1}返回user_id除非你有一些触发器或其他魔法干扰,否则这是相同的。

有关数据修改的更多细节(a.k.a。“可写”)CTE:

答案 1 :(得分:0)

<块引用>

使用函数插入主从

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$;