19

使用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 和 5.1 怎么样?

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

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

4

1 回答 1

20

好吧,我进行了一些测试。使用 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. 根据 (2),返回的 ResultSetgetGeneratedKeys将包含成功插入的行的条目。将不会为失败的插入生成键行(更新计数值为Statement.EXECUTE_FAILED

  4. ?

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

  6. ?

于 2011-02-11T01:39:50.287 回答