【问题标题】:ORA-00001: unique constraint primary key violatedORA-00001: 违反唯一约束主键
【发布时间】:2014-11-04 21:37:58
【问题描述】:
DELETE from dbo.T_LIAV_AGENT_STATE_APPROVAL SAP
WHERE EXISTS (SELECT UNIQUE 1 FROM MCS_SYNC_STATE_APPR APP

                inner join MCS_SYNC_NAME SN on SN.SE_NAME_ID = APP.SE_NAME_ID
                                    and SN.ACTION in('U','S')
                Where APP.SE_name_id = SAP.AV_NAME_ID
                and APP.SYNC_INSTANCE_ID = param_inst_ID);
COMMIT;

INSERT INTO dbo.T_LIAV_AGENT_STATE_APPROVAL

SELECT  UNIQUE 

    APP.SE_NAME_ID            AS AV_NAME_ID,
    APP.STATE                 AS AV_STATE,
    APP.APPROVAL_TYPE         AS AV_APPROVAL_TYPE,
    APP.START_DATE            AS AV_START_DATE,
    APP.END_DATE              AS AV_END_DATE,
    APP.APPOINTED             AS AV_APPOINTED,
    APP.RENEWAL_DATE          AS AV_RENEWAL_DATE,
    APP.LICENSE               AS AV_LICENSE,
    COMPANY_NAME_ID           as AV_COMPANY_CODE,
    SYSDATE                   AS TSTAMP,
    SYNC_USER_NAME_ID         AS AV_FIRST_USER_ID,
    SYSDATE                   AS AV_FIRST_DATE,
    NULL                      AS AV_LAST_USER_ID,
    NULL                      AS AV_LAST_DATE

FROM MCS_SYNC_STATE_APPR APP

WHERE exists (select 1 from t_liag_agent AG
                     where AG.ag_name_id = APP.SE_NAME_ID)
and APP.SYNC_INSTANCE_ID = param_inst_ID;

这是 SQL 部分,我在调试代码时遇到错误:

ORA-00001:在 T_LIAV_AGENT_STATE_APPROVAL 处违反了唯一约束主键...

这些是主键约束依赖的 2 列 AV_NAME_ID, AV_STATE ..

据我所知,没有重复的数据...您认为还有其他原因吗?

【问题讨论】:

  • "据我所知没有重复数据" - 但 Oracle 认为存在重复数据,我相信这里的 Oracle。
  • 一个原因,您在多个列中有UNIQUE,包括SYSDATE.. 尝试TRUNC(SYSDATE) 将时间元素全部取消为00:00:00
  • @MaheswaranRavisankar SQL 语句中的所有 SYSDATE 都将解析为完全相同的时间。请参阅我对类似问题的回答here
  • @JonHeller 感谢您提供这么好的信息...我希望我不知道很多事情!!!!

标签: oracle unique-constraint


【解决方案1】:

如果您有“CREATE TABLE”权限,请使用 dbms_errlog 包。

  1. 运行脚本:

    begin
      dbms_errlog.create_error_log('DBO.T_LIAV_AGENT_STATE_APPROVAL');
    end;
    /
    
  2. 运行带有附加子句的 INSERT 脚本:

    INSERT INTO dbo.T_LIAV_AGENT_STATE_APPROVAL
    SELECT ...
    FROM ...
    LOG ERRORS INTO err$_T_LIAV_AGENT_STATE_APPROVAL REJECT LIMIT UNLIMITED;
    
  3. 检查错误记录表是否有错误:

    select * from err$_T_LIAV_AGENT_STATE_APPROVAL;
    

您将看到所有违反约束的记录和错误消息。

【讨论】:

    【解决方案2】:

    与 Insert table 语句相比,Select 语句缺少一列,因此出现此错误。当我将该列添加到 select 语句时,它运行良好。

    【讨论】:

      【解决方案3】:

      如果您不确定违反了哪个唯一约束,可以运行以下 SQL:

      Select Distinct table_name
      From all_indexes
      Where index_name = 'CONSTRAINT_NAME';
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-06
        • 1970-01-01
        • 2016-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多