在MySQL中使用getGeneratedKeys和Connector/J进行批处理插入

2022-09-02 13:25:33

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

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

  2. 如果不是每个查询都导致插入(例如,有一个 或 查询),该怎么办?我是为每个语句添加一行,还是只为新语句获取一行?insert ignoreinsert ... on duplicate key updateStatement.getGeneratedKeys()

  3. 插入的主记录之一的错误以及是否设置为连接字符串中的错误将返回什么?Statement.getGeneratedKeys()continueBatchOnErrortrue

  4. Connector/J 版本 5.0.x 与 5.5.x 之间的相关行为是否存在任何差异?MySQL 5.0 与 5.1 怎么样?

  5. 是否有任何其他问题或陷阱,我应该注意?

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


答案 1

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

  1. Statement.getGeneratedKeys()按预期工作刀片

  2. 如果插入或更新了某一行(返回的更新计数数组返回“1”或“2”),则将具有该行的键。如果该行未被修改(或导致 no-op,则返回 ),则没有键。executeBatch()Statement.getGeneratedKeys()insert ignoreinsert ... on duplicate key updateexecuteBatch()3

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

  4. ?

  5. 在 JDBC 连接字符串中要小心。如果将其设置为 ,则任何失败都将导致重写的“块”中的每一行都被视为失败。处理此问题的一种方法是循环访问失败的行,并在不进行批处理的情况下重试它们。rewriteBatchedStatementstrue

  6. ?


答案 2

推荐