PostgreSQL如何使用RETURNING返回插入结果?

夜瑶酱_6722

夜瑶酱_6722

2026-08-20

746人浏览

原创

insert 后用 returning id 可安全获取生成的主键值,需确保目标列有自动生成逻辑(如 serial 或 default),显式指定列名更可靠,批量插入时 returning 返回与插入行严格对应的完整结果集。

postgresql如何使用returning返回插入结果?

能直接返回,且必须用 RETURNING,别碰 LASTVAL() 或 CURRVAL() —— 它们在并发或批量场景下会出错。

INSERT 后怎么写 RETURNING 才拿到 ID?

核心是:在 INSERT 语句末尾加 RETURNING id,前提是目标列确实在插入时生成了值(比如 SERIAL、GENERATED ALWAYS AS IDENTITY,或带 DEFAULT nextval(...))。

  • 显式指定列名比 RETURNING * 更安全,避免字段顺序或默认值干扰
  • 如果插入时手动指定了 id 值(如 INSERT INTO t (id, name) VALUES (123, 'x')),RETURNING id 返回的就是你写的 123,不是“新生成”的
  • 对 UUID 主键(如用 gen_random_uuid()),只要该列在 VALUES 或 DEFAULT 中被赋值,RETURNING id 就能取到
  • 语法错误常见于把 RETURNING 写成子查询或放在 WITH 内部——它必须紧贴在 INSERT/UPDATE/DELETE 语句末尾

批量 INSERT 怎么确保每行 ID 都不丢?

多行 VALUES + RETURNING 是原子的,返回结果集行数与插入行数严格一致,顺序也完全对应。

  • 客户端必须调用 fetchall()(Python psycopg2)或遍历 res.rows(Node.js pg),不能只取首行
  • 若其中某行违反约束(如唯一键冲突),整个语句失败,不返回任何行 —— 没有“部分成功”
  • 想跳过冲突继续插?得用 ON CONFLICT DO NOTHING,此时 RETURNING 只返回真正插入的行
  • 一次插入不宜超过 5000 行,否则单语句解析开销陡增,容易触发 PostgreSQL 的内存或超时限制

和 ON CONFLICT 一起用时 RETURNING 还有效吗?

有效,但返回内容取决于实际执行的操作类型。

  • ON CONFLICT ... DO NOTHING:只返回成功插入的行
  • ON CONFLICT ... DO UPDATE:所有匹配冲突键的行都会出现在结果中(包括未真正修改数据的行)
  • 可用技巧:RETURNING id, xmax = 0 AS is_inserted,xmax = 0 表示该行是新插入的,否则为更新
  • 注意:DO UPDATE SET 子句里不能引用 RETURNING 中定义的别名,它们不在同一作用域

客户端代码里最容易漏掉哪一步?

不是写错 SQL,而是没正确消费返回结果集。

  • psycopg2:必须用 cursor.execute(sql, params) + cursor.fetchone() 或 .fetchall();只调 execute() 不取值,等于没拿
  • Node.js pg:必须 await client.query(...),然后从 res.rows 读,不是 res.rowCount
  • Go pgx:rows, _ := conn.Query(ctx, sql, args...) 后必须循环 rows.Next() 并 rows.Scan(),否则资源泄漏且无数据
  • ORM 如 SQLAlchemy 2.0+ 默认启用 RETURNING,但若手动拼 SQL 或禁用自动返回,仍需显式加子句并处理结果

最常被当成“理所当然”的地方,其实是批量插入后只取了第一行 ID 就结束;还有就是误以为 RETURNING 能拿到触发器里改过的字段值——它拿不到,除非触发器是 AFTER 且你另起查询。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
postgresql常用命令
postgresql常用命令

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、\l、\c、\dt、\d table_name、\du、\i file_name、\e和\q等。本专题为大家提供postgresql相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.10

233

5

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4529

19

postgresql常用命令有哪些
postgresql常用命令有哪些

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、\l、\c、\dt、\d table_name、\du、\i file_name、\e和\q等。更详细的postgresql常用命令,大家可以访问下面的文章。

2023.11.16

647

3

postgresql常用命令介绍
postgresql常用命令介绍

postgresql常用命令有\l、\d、\d5、\di、\ds、\dv、\df、\dn、\db、\dg、\dp、\c、\pset、show search_path、ALTER TABLE、INSERT INTO、UPDATE、DELETE FROM、SELECT等。想了解更多postgresql的相关内容,可以阅读本专题下面的文章。

2023.11.20

1396

6

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

2026.02.12

460

19

PostgreSQL 性能优化与查询执行计划实战
PostgreSQL 性能优化与查询执行计划实战

本专题深入解析PostgreSQL性能优化核心,聚焦查询执行计划的实战应用。通过EXPLAIN命令精准定位瓶颈,结合索引策略、SQL改写与参数调优,系统提升查询效率。从执行计划解读到性能调优全流程,助你掌握数据库性能诊断与优化实战能力。

2026.05.08

150

10

PostgreSQL 在 Next.js / Go 全栈架构中的工程化实践
PostgreSQL 在 Next.js / Go 全栈架构中的工程化实践

本文详解如何利用Next.js(搭配Drizzle ORM)与Go后端构建高性能应用,充分发挥PG在JSONB非结构化存储与pgvector向量检索上的优势。从数据建模到Docker容器化部署,打造支持AI时代的“One Database”工程化解决方案。

2026.05.08

901

10

PostgreSQL高级特性、内核机制与现代数据架构
PostgreSQL高级特性、内核机制与现代数据架构

本专题从MVCC并发控制与WAL日志等内核机制出发,详解JSONB、PostGIS及pgvector等高级特性。探讨如何利用单一引擎支撑关系型、向量及图数据等现代数据架构需求,助您掌握构建高并发、智能化应用的核心技术。

2026.05.08

244

10

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2023.06.29

2745

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.8万人学习