插入后怎么拿到数据库生成的主键?PostgreSQL 与 MySQL 的 getGeneratedKeys 差别在哪?批量插入时每行的键怎么取?为什么不能用 select max(id)?这篇逐项实测。
1 RETURN_GENERATED_KEYS:列 [id, name, created],行 [[1, a, <时间>]]
2 只要 id 列(new String[]{"id"}):列 [id],行 [[2]]
3 按列序号 prepare:PSQLException(0A000) Returning autogenerated keys is not supported.
4 没有请求时 getGeneratedKeys():列 [],行 []
5 显式给了 id=100(没有用到自增):列 [id, name, created],行 [[100, explicit, <时间>]]
6 一条 INSERT 带三行 VALUES:列 [id, name, created],行 [[4, m1, <时间>], [5, m2, <时间>], [6, m3, <时间>]]
7 Statement.executeUpdate(sql, RETURN_GENERATED_KEYS):列 [id, name, created],行 [[7, st, <时间>]]
8 executeBatch 4 行:更新计数 [1, 1, 1, 1];列 [id, name, created],行 [[8, b0, <时间>], [9, b1, <时间>], [10, b2, <时间>], [11, b3, <时间>]]1 RETURN_GENERATED_KEYS:列 [id, name, created],行 [[1, a, <时间>]]
2 只要 id 列(new String[]{"id"}):列 [id],行 [[2]]
3 按列序号 prepare:PSQLException(0A000) Returning autogenerated keys is not supported.
4 没有请求时 getGeneratedKeys():列 [],行 []
5 显式给了 id=100(没有用到自增):列 [id, name, created],行 [[100, explicit, <时间>]]
6 一条 INSERT 带三行 VALUES:列 [id, name, created],行 [[4, m1, <时间>], [5, m2, <时间>], [6, m3, <时间>]]
7 Statement.executeUpdate(sql, RETURN_GENERATED_KEYS):列 [id, name, created],行 [[7, st, <时间>]]
8 executeBatch 4 行:更新计数 [1, 1, 1, 1];列 [id, name, created],行 [[8, b0, <时间>], [9, b1, <时间>], [10, b2, <时间>], [11, b3, <时间>]]1 RETURN_GENERATED_KEYS:列 [GENERATED_KEY],行 [[1]]
2 只要 id 列(new String[]{"id"}):列 [GENERATED_KEY],行 [[2]]
3 按列序号 new int[]{1}:列 [GENERATED_KEY],行 [[3]]
4 没有请求时 getGeneratedKeys():SQLException(S1009) Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate(), Statement.executeLargeUpdate() or Connection.prepareStatement().
5 显式给了 id=100(没有用到自增):列 [GENERATED_KEY],行 [[100]]
6 一条 INSERT 带三行 VALUES:列 [GENERATED_KEY],行 [[101], [102], [103]]
7 Statement.executeUpdate(sql, RETURN_GENERATED_KEYS):列 [GENERATED_KEY],行 [[104]]
8 executeBatch 4 行:更新计数 [1, 1, 1, 1];列 [GENERATED_KEY],行 [[105], [106], [107], [108]]1 RETURN_GENERATED_KEYS:列 [GENERATED_KEY],行 [[1]]
2 只要 id 列(new String[]{"id"}):列 [GENERATED_KEY],行 [[2]]
3 按列序号 new int[]{1}:列 [GENERATED_KEY],行 [[3]]
4 没有请求时 getGeneratedKeys():SQLException(S1009) Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate(), Statement.executeLargeUpdate() or Connection.prepareStatement().
5 显式给了 id=100(没有用到自增):列 [GENERATED_KEY],行 [[100]]
6 一条 INSERT 带三行 VALUES:列 [GENERATED_KEY],行 [[101], [102], [103]]
7 Statement.executeUpdate(sql, RETURN_GENERATED_KEYS):列 [GENERATED_KEY],行 [[104]]
8 executeBatch 4 行:更新计数 [-2, -2, -2, -2];列 [GENERATED_KEY],行 [[105], [106], [107], [108]]9 8 个线程各插入 400 行,每次插入后同时取 getGeneratedKeys() 与 select max(id):共 3200 次,两者不一致 2919 次(max(id) 看到了别的连接插入的行)
9 8 个线程各插入 400 行,每次插入后同时取 getGeneratedKeys() 与 select max(id):共 3200 次,两者不一致 2649 次(max(id) 看到了别的连接插入的行)