插入最近截断的表时重复键行

时间:2014-06-25 20:38:26

标签: java sql prepared-statement

我有一张每天重复使用的桌子。首先,我们清除它。我试过了两个:

BEGIN TRAN
DELETE FROM <tableName>
COMMIT

BEGIN TRAN
TRUNCATE TABLE <tableName>
COMMIT

这些提交成功,我可以去看看,表格确实是无行的。然后在它自己的事务中,我将插入所有今天的数据(使用Java中的Prepared Statements),每一行都给出:

java.sql.SQLException: 
Cannot insert duplicate key row in object '<tableName>' with unique index '<index>'. 
The duplicate key value is (<column A>, <column B>, <column C>).

该表上确实存在一个索引,该索引对于A,B,C是唯一且非聚集的,但是当表本身为空时,为什么它被视为重复数据?

1 个答案:

答案 0 :(得分:0)

我终于找到了这里发生的事情,感谢评论中的一些调试帮助。

问题出在我的战略和交易处理上。我试图做两件相互矛盾的事情:

  • 首先执行一批~1000次插入,如果一次无法切换到逐行
  • 为所有人保留一笔交易。

问题是第一批通过PreparedStatement实际上会对其中一些批次成功,但会发出警告,然后逐行插入,导致重复的数据异常。这很难跟踪,因为批处理中的DataTruncation会产生SQLException,而不是SQLWarning

解决方案是将交易下移到两个执行策略。