在带有Connector / J的MySQL中使用getGeneratedKeys和批量插入
使用Connector / J,我想在主表中进行批量插入,然后批量插入到详细信息表中(两者都是PreparedStatement.executeBatch()
)。 我没有在网上找到太多的信息,所以我正在寻找有经验的人的任何反馈。
-
我可以使用
Statement.getGeneratedKeys()
来获取主表中新插入的行的ID,以便我可以在详细信息插入中将它们用作外键吗? -
如果不是每个查询都导致插入(例如,
insert ... on duplicate key update
查询中有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呢?
-
还有其他任何我应该注意的问题或陷阱吗?
-
有一个更好的方法吗?
好吧,我做了一些测试。 使用Connector / J 5.1和MySQL 5.1.42,我观察到以下内容:
-
Statement.getGeneratedKeys()
按插入方式工作 -
如果插入或更新了一行(
executeBatch()
返回的更新计数数组返回’1’或’2’),则Statement.getGeneratedKeys()
将具有该行的键。 如果未修改行(insert ... on duplicate key update
insert ignore
或insert ... on duplicate key update
导致无操作,executeBatch()
返回3
),则没有键。 -
getGeneratedKeys
返回的ResultSet将具有成功插入行的条目,如(2)所示。 失败的插入不会生成关键行(其中更新计数值为Statement.EXECUTE_FAILED
) -
?
-
注意JDBC连接字符串中的
rewriteBatchedStatements
。 如果将其设置为true
,则任何失败都将导致重写的“块”中的每一行被视为失败。 处理此问题的一种方法是迭代失败的行并重试它们而不进行批处理。 -
?