java - 使用 getGeneratedKeys 在带有 Connector/J 的 MySQL 中批量插入

标签 java mysql database jdbc connector-j

使用 Connector/J,我想批量插入主表,然后批量插入详细信息表(PreparedStatement.executeBatch() 两者都适用)。我在网上没有找到太多信息,所以我正在寻找有这方面经验的人的任何反馈。

  1. 我可以用吗 Statement.getGeneratedKeys() 来获取 新插入行的 ID 在主表中,这样我就可以 使用它们作为外键 细节插入?

  2. 如果不是每个查询都有结果怎么办? 插入(例如,有一个 insert 忽略insert ... 重复 key 更新查询)?我会得到一排 在 Statement.getGeneratedKeys() 中为每个 声明,还是只针对新声明?

  3. 会发生什么 Statement.getGeneratedKeys() 返回 其中一个有错误 插入的主记录,和 continueBatchOnError 设置为 true 在连接字符串中?

  4. Connector/J 版本 5.0.x 和 5.5.x 之间的相关行为有什么不同吗? MySQL 5.0 与 5.1 怎么样?

  5. 还有什么我应该注意的其他问题或陷阱吗?

  6. 有没有更好的方法来做到这一点?

最佳答案

好吧,我进行了一些测试。使用 Connector/J 5.1 和 MySQL 5.1.42,我观察到以下内容:

  1. Statement.getGeneratedKeys() 按预期方式进行插入

  2. 如果插入或更新了一行(executeBatch() 返回的更新计数数组返回 '1' 或 '2'),Statement.getGeneratedKeys() 将具有该行的键。如果该行未被修改(insert ignoreinsert ... on duplicate key update 导致无操作,executeBatch()返回 3),没有 key 。

  3. getGeneratedKeys 返回的结果集将包含成功插入行的条目,如 (2) 所示。不会为失败的插入生成键行(其中更新计数值为 Statement.EXECUTE_FAILED)

  4. ?

  5. 注意 JDBC 连接字符串中的 rewriteBatchedStatements。如果它设置为 true,任何失败都将导致重写的“ block ”中的每一行都被视为失败。处理此问题的一种方法是迭代失败的行并在不进行批处理的情况下重试。

  6. ?

关于java - 使用 getGeneratedKeys 在带有 Connector/J 的 MySQL 中批量插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4952316/

相关文章:

mysql - 如何合并两个mysql查询

mysql - 如何构建这个查询?

java - 处理测试继承的Testng

java - `++arr[1+r.nextInt(6)];` 这行代码是做什么的

mysql 连接多个

html - 如何让 Django 在数据库中显示我想要的内容

mysql - 有什么办法可以加快这个查询吗?

java - 使用 jQuery 通过 POST 向 java 方法发送和接收数据

java - 提高 Android GPS 性能

mysql - Redis 和 MySQL——我什么时候应该单独使用 Redis VS 什么时候将它与 MySQL 一起使用?