关于如何通过java.sql.Statement.executeUpdate调用分配给新创建的记录的自动递增标识字段的任何建议?

我知道如何在SQL中为几个数据库平台执行此操作,但是想知道java.sql存在哪些数据库独立接口来执行此操作,以及人们在跨数据库平台上使用此体验的任何输入。

===============>>#1 票数:23 已采纳

以下snibblet代码应该做ya':

PreparedStatement stmt = conn.prepareStatement(sql, 
                                 Statement.RETURN_GENERATED_KEYS);
// ...

ResultSet res = stmt.getGeneratedKeys();
while (res.next())
    System.out.println("Generated key: " + res.getInt(1));

已知这适用于以下数据库

  • 德比
  • MySQL的
  • SQL Server

对于不起作用的数据库(HSQLDB,Oracle,PostgreSQL等),您需要使用特定于数据库的技巧。 例如,在PostgreSQL上,您将调用SELECT NEXTVAL(...)来查询相关序列。

请注意, executeUpdate(...)的参数是类似的。

===============>>#2 票数:2

ResultSet keys = statement.getGeneratedKeys();

稍后,只需迭代ResultSet。

===============>>#3 票数:0

我总是不得不在插入后使用查询进行第二次调用。

您可以使用像hibernate这样的ORM。 我认为它会为你做这些事情。

===============>>#4 票数:0

@ ScArcher2:我同意,Hibernate需要再次调用才能获得新生成的标识,除非使用了高级生成器策略(sequence,hilo ...)

===============>>#5 票数:0

@ ScArcher2

第二次通话非常危险。 INSERT和选择生成的自动生成的密钥的过程必须是原子的,否则您可能会在密钥选择上收到不一致的结果。 考虑两个异步INSERT ,它们在有机会选择生成的密钥之前完成。 哪个进程获取哪个键列表? 大多数跨数据库ORM都必须执行诸如进程内线程锁定之类的烦人事情,以保持结果的确定性。 不是你想要手工完成的事情,特别是如果你使用的数据库支持原子生成的密钥检索(HSQLDB是我所知道的唯一不支持的数据库)。

  ask by Sean translate from so

未解决问题?本站智能推荐:

1回复

Java SQL插入具有自动增量ID的行

我正在尝试插入具有以下列的数据库,但是出现以下错误: 您的SQL语法有误; 检查与您的MySQL服务器版本相对应的手册以获取在'Id'值附近使用正确的语法('Gonzalo','Higuain','09 7 2018','Argentina',12.0,'Attacker','Right
3回复

java-插入具有自动增量字段的行

我正在尝试在表中插入一行,并添加一个自动递增的字段,但出现错误。 该表的结构为: ID:自动递增 级别:文本 概念:文本 。 在w3c中,我读到要在表中插入新记录,我们将不必为“自动增量”列指定值(将自动添加唯一值)。 我究竟做错了什么?
2回复

Java插入带有自动增量字段的表

如何通过主键自动增量插入表中? 我想使用准备好的语句,并且不断收到此错误0 <1 ...我尝试了该语句,它有效:S 我尝试过: 谢谢好人:)
4回复

jdbc插入具有自动增量字段的数据库

我的代码中有这个: 我的表如下: 问题是,当我第一次填写表格时,所有值都被添加到了数据库中,但是如果我第二次尝试这样做,它们将不会被添加。 如果我删除了UserID表,一切将正常运行。 这就是我创建UserID的方式(图片来自- 这里 ) 我不确定如何使其与UserI
4回复

SQL Server自动标识字段的最大大小

SQL Server标识字段(int)的最大大小是多少? 我在一些表格中每天删除和插入一些记录,我很好奇这会对自动识别字段产生什么影响。 如果需要,我每晚都可以运行一份工作并截断这些数据。 我很感激你的想法。 谢谢。
1回复

SQL java获取赋值给自动增量主键的值[重复]

这个问题在这里已有答案: 如何在JDBC中获取插入ID? 12个答案 我的表中有一个主键自动增量属性。 我想知道为使用statement.executeUpdate()插入的行分配给它的值。 如何以最佳方式实现这一目标?
3回复

如何使用Java / Hibernate在SQL中自动插入Current DATE

当我创建一个新的OperantionBank时,我需要自动将当前日期添加到我的数据库中。 我正在使用Hibernate。 谢谢
3回复

[Java]插入SQL时发生错误,表格中的数据会自动增加-userId

因此,我正在制作一个注册页面,当我输入所有字段并单击注册进行提交时,将调用enterNewUser(,,,),并将字段userId,用户名,密码和角色插入表User中。 我通过运行用户选择*来确认这一点; 进入MYSQL工作台。 然后调用enterUsername(,,,),我得到这个
2回复

具有自动增量功能的JDBC插入

我正在使用Java中的MySQL库执行查询。 在我的数据库结构中,有一列称为cod_nfs (主键,不是null和auto_increment)。 通常在每个插入查询中,我都将值设置为null并且在执行查询后,它会将最后一个id递增,但是在java中这样做会给我例外。 那是代码:
1回复

无法将java.sql.Date插入数据库中的“ Date”字段

我正在获取一个字符串值,例如“ 2012-01-20”,并将其转换为sql.Date,以将其插入数据库中。 码 运行此代码时,出现异常“” [Microsoft] [ODBC SQL Server驱动程序]未实现可选功能” 我在这里做错了什么? 请帮助!