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

yka*_*ich 16 java mysql database jdbc connector-j

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

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

  2. 如果不是每个查询都导致插入(例如,有一个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 vs 5.1怎么样?

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

  6. 有一个更好的方法吗?

yka*_*ich 18

好吧,我做了一些测试.使用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),则没有键.

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

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