我正在使用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)
可以看出table2
和table3
是table1
的子表
我可以在user_id
(父级)中提取新插入行的table1
:
INSERT INTO "table1" (default,'johnee','john','smith',default) RETURNING userid;
我需要将新提取的ID(来自table1
)插入user_id
和table2
的{{1}}列以及这些表的唯一数据。基本上3 X INSERT ...
我该怎么做?
答案 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$;