Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 插入到最近被截断的表时重复键行_Java_Sql_Prepared Statement - Fatal编程技术网

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

Java 插入到最近被截断的表时重复键行,java,sql,prepared-statement,Java,Sql,Prepared Statement,我有一张每天重复使用的桌子。首先,我们要把它弄清楚。我两个都试过了: BEGIN TRAN DELETE FROM <tableName> COMMIT 开始传输 删除 犯罪 及 开始传输 截断表 犯罪 这些提交成功了,我可以去看看,表确实是少行的。然后在它自己的事务中,我插入今天的所有数据(使用Java中准备好的语句),每一行都给出: java.sql.SQLException: Cannot insert duplicate key row in object '<

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

BEGIN TRAN
DELETE FROM <tableName>
COMMIT
开始传输
删除
犯罪

开始传输
截断表
犯罪
这些提交成功了,我可以去看看,表确实是少行的。然后在它自己的事务中,我插入今天的所有数据(使用Java中准备好的语句),每一行都给出:

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>).
java.sql.SQLException:
无法在具有唯一索引“”的对象“”中插入重复的键行。
重复的键值为(,)。

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

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

这个问题确实存在于我的策略和事务处理中。我试图做两件相互矛盾的事情:

  • 第一批执行约1000个插入,如果一个插入失败,则逐行切换
  • 为所有人保留一笔交易
问题是,通过
PreparedStatement
的第一批处理实际上会成功地处理其中的一些语句,但会抛出警告,然后继续逐行插入,从而导致重复的数据异常。这更难跟踪,因为批处理中的
DataTruncation
会导致
SQLException
,而不是
SQLWarning


解决方案是将事务向下移动到两种执行策略。

表仍然是空的,但很可能是插入了重复的记录,就像异常所说的那样。罕见的情况是,在oracle/db2/mssql中,有时可以有多个名称相同(但架构/所有者不同)的表,所以可能是在清除一个表,但是尝试写入其他行时,请尝试插入一行并查看表数据。然后尝试添加第二个,看看是否确实存在重复项。显示导致问题的表定义和一些示例数据。我认为您正在迭代寻找解决方案。检查你的抽象,并用它们做一些简单的测试。不要为打扰我们而烦恼,如果你是的话,我们会忽略这些评论。
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>).