【问题标题】:Using getGeneratedKeys with batch inserts in MySQL with Connector/J在 MySQL 中通过 Connector/J 使用 getGeneratedKeys 和批量插入
【发布时间】:2011-06-24 13:13:39
【问题描述】:
使用连接器/J,我想批量插入到主表中,然后批量插入到详细信息表中(两者都为PreparedStatement.executeBatch())。我在网上没有找到太多信息,所以我正在寻找有这方面经验的人的任何反馈。
我可以使用
Statement.getGeneratedKeys()获取
新插入行的 ID
在主表中,这样我就可以
使用它们作为外键
细节插入?
如果不是每个查询都导致
插入(例如,有一个 insert
ignore 或 insert ... on duplicate
key update 查询)?我会得到一排
在Statement.getGeneratedKeys() 中为每个
声明,还是只针对新声明?
会发生什么
Statement.getGeneratedKeys()返回
其中一个有错误
插入的主记录,和
continueBatchOnError 设置为 true
在连接字符串中?
Connector/J 版本 5.0.x 与 5.5.x 之间的相关行为是否存在差异? MySQL 5.0 与 5.1 怎么样?
还有其他我应该注意的问题或陷阱吗?
有更好的方法吗?
【问题讨论】:
标签:
java
mysql
database
jdbc
connector-j
【解决方案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),则没有键。
getGeneratedKeys 返回的 ResultSet 将包含成功插入的行的条目,根据 (2)。将不会为失败的插入生成键行(更新计数值为Statement.EXECUTE_FAILED)
?
注意 JDBC 连接字符串中的 rewriteBatchedStatements。如果设置为true,任何失败都会导致重写的“块”中的每一行都被视为失败。处理此问题的一种方法是迭代失败的行并重试它们而不进行批处理。
?