使用 Connector/J,我想批量插入主表,然后批量插入详细信息表(PreparedStatement.executeBatch()
两者都适用)。我在网上没有找到太多信息,所以我正在寻找有这方面经验的人的任何反馈。
我可以用吗
Statement.getGeneratedKeys()
来获取 新插入行的 ID 在主表中,这样我就可以 使用它们作为外键 细节插入?如果不是每个查询都有结果怎么办? 插入(例如,有一个
insert 忽略
或insert ... 重复 key 更新
查询)?我会得到一排 在Statement.getGeneratedKeys()
中为每个 声明,还是只针对新声明?会发生什么
Statement.getGeneratedKeys()
返回 其中一个有错误 插入的主记录,和continueBatchOnError
设置为true
在连接字符串中?Connector/J 版本 5.0.x 和 5.5.x 之间的相关行为有什么不同吗? MySQL 5.0 与 5.1 怎么样?
还有什么我应该注意的其他问题或陷阱吗?
有没有更好的方法来做到这一点?
最佳答案
好吧,我进行了一些测试。使用 Connector/J 5.1 和 MySQL 5.1.42,我观察到以下内容:
Statement.getGeneratedKeys()
按预期方式进行插入如果插入或更新了一行(
executeBatch()
返回的更新计数数组返回 '1' 或 '2'),Statement.getGeneratedKeys()
将具有该行的键。如果该行未被修改(insert ignore
或insert ... on duplicate key update
导致无操作,executeBatch()
返回3
),没有 key 。getGeneratedKeys
返回的结果集将包含成功插入行的条目,如 (2) 所示。不会为失败的插入生成键行(其中更新计数值为Statement.EXECUTE_FAILED
)?
注意 JDBC 连接字符串中的
rewriteBatchedStatements
。如果它设置为true
,任何失败都将导致重写的“ block ”中的每一行都被视为失败。处理此问题的一种方法是迭代失败的行并在不进行批处理的情况下重试。?
关于java - 使用 getGeneratedKeys 在带有 Connector/J 的 MySQL 中批量插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4952316/