在 MySQL 中通过 Connector/J 使用 getGeneratedKeys 和批量插入
Posted
技术标签:
【中文标题】在 MySQL 中通过 Connector/J 使用 getGeneratedKeys 和批量插入【英文标题】:Using getGeneratedKeys with batch inserts in MySQL with Connector/J 【发布时间】: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 怎么样?
还有其他我应该注意的问题或陷阱吗?
有更好的方法吗?
【问题讨论】:
【参考方案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
,任何失败都会导致重写的“块”中的每一行都被视为失败。处理此问题的一种方法是迭代失败的行并重试它们而不进行批处理。
?
【讨论】:
请注意,桌子上有一些限制 - ***.com/q/7333524/1339987以上是关于在 MySQL 中通过 Connector/J 使用 getGeneratedKeys 和批量插入的主要内容,如果未能解决你的问题,请参考以下文章
与 MySql 的连接正在自动中止。如何正确配置Connector/J?
与 MySql 的连接正在自动中止。如何正确配置Connector/J?
MySQL Connector/J 6.x jdbc.properties 配置, mysql-connector-java-6.0.4.jar 异常
MySQL 的 Connector/J 可以与 MariaDB 一起使用吗?
MySQL Connector/J 6.x jdbc.properties 配置, mysql-connector-java-6.0.4.jar 异常