我有一张每天重复使用的桌子。首先,我们清除它。我试过了两个:
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是唯一且非聚集的,但是当表本身为空时,为什么它被视为重复数据?
答案 0 :(得分:0)
我终于找到了这里发生的事情,感谢评论中的一些调试帮助。
问题出在我的战略和交易处理上。我试图做两件相互矛盾的事情:
问题是第一批通过PreparedStatement
实际上会对其中一些批次成功,但会发出警告,然后逐行插入,导致重复的数据异常。这很难跟踪,因为批处理中的DataTruncation
会产生SQLException
,而不是SQLWarning
。
解决方案是将交易下移到两个执行策略。