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

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

  1. 我可以使用Statement.getGeneratedKeys()来获取主表中新插入的行的ID,以便我可以在详细信息插入中将它们用作外键吗?

  2. 如果不是每个查询都导致插入(例如, insert ... on duplicate key update查询中有insert ignoreinsert ... on duplicate key update ),该怎么办? 我会在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 ... on duplicate key update insert ignoreinsert ... on duplicate key update导致无操作, executeBatch()返回3 ),则没有键。

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

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

Interesting Posts