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

问题描述 投票:2回答:4

我有一张桌子:

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);

稍后,当执行下面的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

我的表仅包含3个条目,且所有条目均具有不同的主键,该主键也不为null。任何人都知道这可能是什么?

谢谢,

Peter

sql oracle primary-key
4个回答
7
投票

我的表仅包含3个条目,且所有条目均具有不同的主键,该主键也不为null。

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

您需要做的是使用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>

编辑

您需要弄清楚安装代码和此处发布的简化之间的区别。您可能有一个或多个INSERT语句,这些语句在没有生效约束的情况下意外地执行了不止一次。在代码中添加EXCEPTIONS INTO子句可能有助于您对其进行跟踪。


2
投票

来自here

原因:您尝试尝试启用一个主键约束,但是主键中的列包含NULL值或重复项。.


0
投票

2个主键是否相同?

[当您尝试在表上创建/启用主键时通常会引发此错误


0
投票

我赞成APC的答案,但是由于您似乎在实现它时遇到了一些问题,您可以仅发布此查询的结果:

select my_id, count(*) from my_table group by my_id having count(*) >1

这将使我们(和您)对有问题的密钥有所了解。

© www.soinside.com 2019 - 2024. All rights reserved.