【发布时间】:2020-10-30 23:48:39
【问题描述】:
正在抛出的 JDBC 批量插入语句...
Caused by: oracle.jdbc.OracleDatabaseException: ORA-00001: unique constraint (CHK_INCLRNG_U.DDA_TRIAL_BAL_STG_PK) violated
数据源没有任何重复。目标没有数据,所以不能有重复。我发现有趣的是,当我对表进行计数时,我得到了数据的整个记录数。所以它会在最后立即抛出这个。我的主键在我的 create table 语句中定义如下...
CONSTRAINT DDA_TRIAL_BAL_STG_PK PRIMARY KEY (FIRM_BNK_ID,ACCT_NB,BAT_PROC_DT)
不知道该怎么办。这不是更早发生的,并且不确定我团队中的任何人做了什么导致这种情况。不要相信在这个表上创建了任何索引(我已经读过这可能会导致问题)
如果数据中没有真正的重复项,还有哪些其他问题会引发此错误?
【问题讨论】:
-
错误信息告诉你,它是被违反的主键唯一约束。如果您的目标没有数据,那么删除表并再次尝试插入不会有什么坏处,如果您仍然收到错误,那么您的源数据中肯定有重复插入主键列的内容。我建议您仔细检查一下(并检查您的插入语句以确保正确的数据进入正确的列)
-
@AndrewSayer 我没有任何重复。我对文件运行了 sort -u ,为了安全起见,我只对文件的键值运行了 sort -u 。记录数仍然相同。我已多次删除该表并重试。我认为重要的是要指出这最终会发生。不仅仅是在最后一条记录上,就像在插入最后一条记录之后一样。抛出异常并且我的应用程序失败后表中的计数是文件的计数。为什么写入所有数据后会抛出该异常?我们基本上成功的所有记录。
-
“不相信在这个表上创建了任何索引” - 你是什么意思?你的表有一个主键;如果您没有明确指示 Oracle 使用现有索引,则 Oracle 在 PK 上创建唯一索引。所以,我再问一遍——你这是什么意思?
-
最明显的想到就是数据没有问题,但是插入过程有问题。例如,无论出于何种原因,它被多次尝试。这就是为什么(也许!)插入了正确的行,并且看起来好像在插入所有行之后就抛出了错误。一旦第一行被试探性地再次插入,就会抛出错误。
-
@mathguy 抱歉,这可能引起了混乱。我的意思是没有创建索引,因为我在某处读到其他索引(主键之外)可能会导致此问题。所以只是澄清除了主键约束之外没有在这个表上创建索引。至于你的第二条评论,我认为可能是这样。无论出于何种原因,idk。现在要测试一些东西。