【问题标题】:Primary key violated but no duplciates in source or target [closed]主键违规但源或目标中没有重复项[关闭]
【发布时间】: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。现在要测试一些东西。

标签: java sql oracle jdbc


【解决方案1】:

在 Oracle 中,您可以使用日志错误来捕获异常并查看哪一行违反了约束。

例如

create table t1(col1 number);

create unique index t_ix on t1(col1);

begin
 dbms_errlog.create_error_log('t1');
end;

 --in your insert statement you will have the following statement appended
 log errors reject limit unlimited;

-- The error will be captured in
select * from err$_t1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-28
    • 2018-02-22
    • 1970-01-01
    • 2015-03-05
    • 2021-09-03
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    相关资源
    最近更新 更多