ORA-02437:无法验证<name> - 违反主键

bla*_*ube 2 sql oracle primary-key

我有一张桌子:

CREATE TABLE MY_TABLE (
  MY_ID NUMBER NOT NULL,
  COLUMN_1 NUMBER,
  COLUMN_2 NUMBER
);
ALTER TABLE MY_TABLE ADD CONSTRAINT PK_FOO PRIMARY KEY (MY_ID);
Run Code Online (Sandbox Code Playgroud)

稍后,当执行以下sql时,我收到一个错误:

ALTER TABLE MY_TABLE DROP PRIMARY KEY DROP INDEX;
ALTER TABLE MY_TABLE ADD CONSTRAINT PK_FOO PRIMARY KEY (MY_ID) 

ORA-02437: cannot validate PK_FOO - primary key violated
Run Code Online (Sandbox Code Playgroud)

我的表只包含3个条目,所有条目都有不同的主键,也不是空的.任何人都知道这可能是什么?

谢谢,

彼得

APC*_*APC 7

你必须原谅我们一定程度的怀疑.因为该错误肯定表示重复值.

你需要做的是使用该exceptions条款.这将显示违反约束的记录的ROWID.您可能需要创建目标表:默认情况下,脚本会创建一个名为EXCEPTIONS的表:

SQL> ALTER TABLE MY_TABLE ADD CONSTRAINT PK_FOO PRIMARY KEY (MY_ID);
ALTER TABLE MY_TABLE ADD CONSTRAINT PK_FOO PRIMARY KEY (MY_ID)
                                    *
ERROR at line 1:
ORA-02437: cannot validate (APC.PK_FOO) - primary key violated


SQL> @%ORACLE_HOME%\rdbms\admin\utlexpt1.sql

Table created.

SQL> ALTER TABLE MY_TABLE ADD CONSTRAINT PK_FOO PRIMARY KEY (MY_ID)
  2  exceptions into exceptions
  3  /
ALTER TABLE MY_TABLE ADD CONSTRAINT PK_FOO PRIMARY KEY (MY_ID)
                                    *
ERROR at line 1:
ORA-02437: cannot validate (APC.PK_FOO) - primary key violated


SQL> select * from exceptions
  2  /

ROW_ID             OWNER TABLE_NAME CONSTRAINT
------             ----- ---------- ----------
AABQXcAAEAAAXUPAAD APC   MY_TABLE   PK_FOO        
AABQXcAAEAAAXUPAAB APC   MY_TABLE   PK_FOO        

SQL>
Run Code Online (Sandbox Code Playgroud)

编辑

您需要弄清楚安装代码与此处发布的简化之间有何不同.您可能有一个或多个INSERT在约束未生效时意外执行的语句不止一次.将EXCEPTIONS INTO子句添加到代码中可能有助于您跟踪它.