Java Postgresql,使用JDBC插入后获取生成的序列
我们有一个java数据库抽象,它为我们做了大量的插入。在运行时,我们将知道表名、要插入的列名和值。由此我们生成一个准备好的语句并进行插入 在sql server land中,我们将在生成的sql末尾加上select id=@@identity,以获取查询返回的新生成的id 现在,我们正在迁移到博士后,这不再有效。我的理解是,在博士后你可以Java Postgresql,使用JDBC插入后获取生成的序列,java,sql-server,postgresql,jdbc,postgresql-9.2,Java,Sql Server,Postgresql,Jdbc,Postgresql 9.2,我们有一个java数据库抽象,它为我们做了大量的插入。在运行时,我们将知道表名、要插入的列名和值。由此我们生成一个准备好的语句并进行插入 在sql server land中,我们将在生成的sql末尾加上select id=@@identity,以获取查询返回的新生成的id 现在,我们正在迁移到博士后,这不再有效。我的理解是,在博士后你可以 insert into foo(a, b) values('a', 'b') returning ID 我们的问题是,在运行时,我们不知道ID列的名称,也不
insert into foo(a, b) values('a', 'b') returning ID
我们的问题是,在运行时,我们不知道ID列的名称,也不知道序列的名称。是否有任何方法可以在不知道序列名称或列名称的情况下获取新插入序列的值?如果您的
insert
没有触发进一步的插入,您可以使用SELECT LASTVAL()代码>就在您的insert
语句之后lastval()是连接生成的最后一个值吗?lastval()返回最近使用nextval为任何序列获取的值:使用,或者jdbcgetGeneratedKeys
选项。我尝试使用此选项的某些位置似乎无法获得会话中没有当前值的错误。@dstarh请确保您没有使用自动提交。getGeneratedKeys()
选项是Java的通用方法。链接问题的公认答案不是“jdbc方式”。@MarkRotterVeel不是傻瓜,在这个例子中,你知道你不想返回的列的名称,在我们的情况下,我们不知道。一个表可能是foo_id,另一个表可能是bar_id。我通过关闭autocommit并在同一个连接中执行两条语句来获取新生成的id,从而使其正常工作。如何将其插入到您一无所知的表中?至少您已经查询了元数据,其中包括主键列的名称。我们知道表名和要插入的所有列,但是我们不知道(在运行时)主键列的名称,因为不需要执行插入。不管怎样,下面的答案是有效的。如果知道要返回的列名,则getGeneratedKeys在postgres中工作,否则会出现一个异常,即未返回任何键。