2014-04-01 37 views
3

我真的建立一个数据库,Postgres的9.3作为后端,有3个表:PostgreSQL的多INSERT ...多列RETURNING

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_idtable1(父):

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

我需要与独特其他数据一起插入新提取的ID(来自table1)插入的table2user_id列和table3那些表格。基本上3 X INSERT ...
我该怎么做?

回答

4

使用data-modifying CTEs到链中的三个插入。事情是这样的:

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; 
  • 我们推荐随时添加用于插入一个字段定义列表(除了特殊的代码)。否则,如果表格结构发生变化,您的代码可能会以惊人的方式破解。

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

  • 最后RETURNING如果你想要得到的user_id返回(显然从一个序列或其他一些默认是可选的,它实际上返回从table3user_id,但是这是相同的,除非你有一些触发器或其他魔法干扰。

更多关于数据改性(又名 “可写”)的CTE的细节:

+1

谢谢that's正是我一直在寻找for..also容易解释,我认为这些都可以嵌套我对任何操作(DELETE,UPDATE,...)以同样的方式,也持续归国不需要,...无论如何,发现并理解...... – user3483211