【问题标题】:Store and reuse value returned by INSERT ... RETURNING存储和重用 INSERT 返回的值 ... RETURNING
【发布时间】:2013-03-26 01:28:27
【问题描述】:

在 PostgreSQL 中,可以将 RETURNING 放在 INSERT 语句的末尾以返回,例如,当该值由 SERIAL 类型自动设置时,该行的主键值。

问题:

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

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

【问题讨论】:

  • 您使用什么语言和客户端库?您是否尝试使用 psql 执行此操作?
  • 我正在尝试在 .sql 脚本中执行此操作,据我了解,该脚本可以包含 plsql。如果那是必要的,那么我必须学习它。
  • PL/PgSQL 可以在DO 块和CREATE [OR REPLACE] FUNCTION 中使用。 PostgreSQL 不支持 plsql,所以你不能使用它。如果您打算使用psql 运行.sql 脚本,您可以使用psql 的反斜杠命令,如\copy\set,但这些是psql 客户端而不是服务器后端的一部分。请查看 PostgreSQL 教程。
  • 说实话,我觉得这也是设计不好的结果;由于缺少自然键,完全依赖主键可能会导致丢失数据句柄的问题。

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


【解决方案1】:

...可用于向其他表中插入值?

您甚至可以在单个 SQL 语句中使用 data-modifying CTE

WITH ins1 AS (
   INSERT INTO tbl1(txt)
   VALUES ('foo')
   RETURNING tbl1_id
   )
INSERT INTO tbl2(tbl1_id)
SELECT * FROM ins1

需要 PostgreSQL 9.1 或更高版本。

dbfiddle here(Postgres 13)
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;

【讨论】:

    猜你喜欢
    • 2011-09-27
    • 2019-06-21
    • 2023-02-16
    • 2020-10-31
    • 2016-01-12
    • 2021-02-05
    • 1970-01-01
    • 2018-08-18
    • 2014-05-11
    相关资源
    最近更新 更多