我正在使用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的更多详细信息:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。