【问题标题】:Postgresql, get generated sequence after insert with JDBCPostgresql,使用 JDBC 插入后获取生成的序列
【发布时间】:2014-04-08 02:54:52
【问题描述】:

我们有一个 java 数据库抽象,它为我们执行了许多插入操作。在运行时,我们将知道表名、要插入的列名和值。从中我们生成一个准备好的语句并执行插入。

在 sql server 中,我们会将 select id = @@identity 添加到生成的 sql 的末尾,以获取查询返回的新生成的 id。

现在我们正在迁移到 postgres,这不再有效。据我了解,在 postgres 中你可以做到,

insert into foo(a, b) values('a', 'b') returning ID

我们的问题是,在运行时我们不知道 ID 列的名称,也不知道序列的名称。有什么方法可以在不知道序列名或列名的情况下,通用获取新插入序列的值?

【问题讨论】:

  • 请注意,getGeneratedKeys() 选项是通用的 Java 方法。链接问题的公认答案不是“jdbc-way”。
  • @MarkRotteveel 不是骗子,在那个例子中你知道你不想返回的列的名称,在我们的情况下我们不知道。它可能是一个表的 foo_id 和另一个表的 bar_id。我已经通过关闭自动提交并在同一连接中执行两个语句来获取新创建的 id 来使其工作。
  • 如何插入到您一无所知的表中?至少您已经查询了元数据,其中包括主键列的名称。
  • 我们知道表名和我们要插入的所有列,但是我们不知道(在运行时)主键列的名称,因为执行插入不需要它。不管下面的答案是否有效。如果您知道要返回的列名,则 getGeneratedKeys 在 postgres 中有效,否则会出现未返回任何键的异常。

标签: java sql-server postgresql jdbc postgresql-9.2


【解决方案1】:

如果您的insert 没有触发进一步的插入,您可以在insert 语句之后使用SELECT LASTVAL();

【讨论】:

  • lastval() 是连接生成的最后一个值吗?
  • lastval() 返回最近使用 nextval 获得的任何序列的值:postgresql.org/docs/current/static/functions-sequence.html
  • 要么使用RETURNING,要么使用jdbc getGeneratedKeys选项
  • 似乎我尝试使用它的一些位置没有工作,得到会话中没有当前值的错误。
  • @dstarh 确保您没有使用自动提交。
猜你喜欢
  • 2016-09-24
  • 2011-07-21
  • 1970-01-01
  • 2017-04-07
  • 2011-06-24
  • 2017-10-16
  • 2011-04-03
  • 2011-06-04
相关资源
最近更新 更多