sql - 存储和重用 INSERT ... RETURNING 返回的值

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

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

问题:

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

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

最佳答案

... that can be used to insert values into other tables?

您甚至可以使用 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<> fiddle 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;

关于sql - 存储和重用 INSERT ... RETURNING 返回的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18169734/

相关文章:

Powershell在运行时将变量写入标准输出

sql - PL/SQL 对具有相同 ID 的行进行编号

mysql - 在 mysql 的查询中不使用 DISTINCT 的查询形成中的逻辑错误

postgresql - 在 postgresql 中,为什么 _PG_init 被调用两次?

postgresql - Yesod persistent-postgresql rawSql 查询与列列表通配符产生语法错误

java - 测试字符串是否为 Java 变量标识符 : (a-z, A-Z,_,$) 后跟 (a-z,A-Z,0-9,_,$)

python - SELECT 中的多个连接

php - mysqli : know what caused the query error

sql - Postgres - 关于值是否包含特定字符串的 WHERE 子句

variables - 如何访问过程之外的变量