首页/数据/SQL 速查/LAST_INSERT_ID 与自增主键回填
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条
变更与事务52 条
性能与执行计划72 条

LAST_INSERT_ID 与自增主键回填

取刚插入行的自增主键:MySQL 的 LAST_INSERT_ID() 是连接级值,不随其它连接变化;PostgreSQL 用 RETURNING 或 currval。

SQL 速查数据更新于 2026-10-12

MySQL

MySQL
INSERT INTO orders (user_id) VALUES (10);
SELECT LAST_INSERT_ID();          -- 本连接本次插入的首个自增值
-- 多行插入时返回首行的自增值

PostgreSQL

PostgreSQL
INSERT INTO orders (user_id) VALUES (10) RETURNING id;
-- 或使用序列(需知道序列名)
SELECT currval(pg_get_serial_sequence('orders', 'id'));
MySQLLAST_INSERT_ID() 按连接隔离,连接池里要与插入用同一连接
PostgreSQL推荐 RETURNING;currval 依赖序列名且需同会话先 nextval
禁用不要用 SELECT MAX(id):并发下会取错

易错点

  • 连接池下“INSERT 查 ID”用了两条连接,LAST_INSERT_ID() 会返回 0 或别的插入值
  • SELECT MAX(id) 在并发写入时几乎必然取错(可能取到其它会话的行),必须用连接级函数或 RETURNING

数据来源与参考

  • MySQL 8.0 Reference Manual · LAST_INSERT_ID
  • PostgreSQL Documentation · Sequence Functions
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌