加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL多INSERT …返回多列

发布时间:2020-12-13 18:06:36 所属栏目:百科 来源:网络整理
导读:我正在使用Postgres 9.3构建一个数据库作为后端,有3个表: table1 (user_id,username,name,surname,emp_date)table2 (pass_id,user_id,password)table3 (user_dt_id,adress,city,phone) 可以看出table2和table3是table1的子表. 我可以在table1(parent)中提取
我正在使用Postgres 9.3构建一个数据库作为后端,有3个表:
table1 (user_id,username,name,surname,emp_date)
table2 (pass_id,user_id,password)
table3 (user_dt_id,adress,city,phone)

可以看出table2和table3是table1的子表.
我可以在table1(parent)中提取新插入行的user_id:

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

我需要将新提取的id(来自table1)插入table2和table3的user_id列以及这些表的唯一数据.基本上3 X INSERT ……
我怎么做?

使用 data-modifying CTEs链接三个INSERT.像这样的东西:
WITH ins1 AS (
   INSERT INTO table1 (username,surname)
   VALUES ('johnee','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,phone)
SELECT ins1.user_id,...
FROM   ins1
RETURNING user_id;

>建议始终为INSERT添加列定义列表(ad-hoc代码除外).否则,如果表结构发生变化,您的代码可能会以惊人的方式中断.
>我省略了列定义列表中您只需输入DEFAULT的列.默认值自动应用.更短,相同的结果.
>如果你想要返回结果user_id,那么最后的RETURNING是可选的(显然是从一个序列或其他默认值.它实际上从table3返回user_id,但除非你有一些触发器或其他魔法干扰,否则它是相同的.

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

> Are SELECT type queries the only type that can be nested?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读