存储和重用INSERT返回的值...返回

时间:2013-03-26 01:28:28

标签: sql postgresql variables primary-key common-table-expression

在PostgreSQL中,可以将RETURNING放在INSERT语句的末尾,以便在该值由{自动设置时 - 返回行的主键值时返回{1}}输入。

题:

如何将此值存储在可用于将值插入其他表的变量中? 请注意,我想将生成的SERIAL插入多个表中。据我所知,id子句仅对单个插入有用。我认为这可能必须在PHP中完成。

这实际上是设计糟糕的结果;如果没有自然键,除非主键上有句柄,否则很难获取唯一的行;

1 个答案:

答案 0 :(得分:17)

  

...可以用来将值插入其他表吗?

您甚至可以使用data-modifying CTE

在单个SQL语句中执行此操作
WITH ins1 AS (
   INSERT INTO tbl1(txt)
   VALUES ('foo')
   RETURNING tbl1_id
   )
INSERT INTO tbl2(tbl1_id)
SELECT * FROM ins1

需要PostgreSQL 9.1或更高版本。

db<>小提琴here (Postgres 11)
sqlfiddle(Postgres 9.6)

回复问题更新

您还可以在一个查询中插入多个表

WITH ins1 AS (
   INSERT INTO tbl1(txt)
   VALUES ('bar')
   RETURNING tbl1_id
   )
 , ins2 AS (
   INSERT INTO tbl2(tbl1_id)
   SELECT tbl1_id FROM ins1
   )
INSERT INTO tbl3(tbl1_id)
SELECT tbl1_id FROM ins1;