Sql ORA-02437:无法验证<;名称>;-违反主键

Sql ORA-02437:无法验证<;名称>;-违反主键,sql,oracle,primary-key,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); 稍后,在执行以下sql时,我得到一个错误: ALTER TABLE MY_TABLE DROP PRIMARY KEY DROP INDEX; ALTER TABLE MY_T

我有一张桌子:

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两个主键相同吗

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

原因:您试图启用 主键约束,但 主键中的列 包含空值或重复项

我的表只包含3个条目,所有条目都具有不同的主键,主键也不为null

你必须原谅我们的一些怀疑。因为该错误明确表示存在重复值

您需要做的是使用
异常
子句。这将显示违反约束的记录的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
语句,这些语句在约束未生效时意外执行了多次。将
异常添加到代码的
子句中可能有助于您追踪它。

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

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

这将使我们(和您)对有问题的键有一些了解。

正如我之前所写的。。。该表包含3个不同的非空主键值。请问,这些主键值是什么?以下是我的表定义:列名数据类型可空列Id PK我的Id编号No 1 1 Column\u 2 NUMBER Yes 2 Column\u 3 NUMBER Yes 3Grrr。。。此处的格式设置不起作用:-(所有列都被定义为数字,我的_ID被定义为主键。正如我之前所写的那样…该表包含3个不同的非空主键值。你能发布你的CREATE table/INSERTS语句以便我们重现你的案例吗?谢谢,我会尝试的…不幸的是,我在执行这些语句时无法重现问题。)很少有sql代码段。该错误仅在执行这些行的大型安装过程中发生。请按my_id have count()>1从my_表组中选择my_id,count(),但不返回任何行。选择my_id,count(*)从my_table group by my_id返回3行,其中有3个不同的id,计数=1。好的-我现在看到了附加的注释,这是作为更复杂的过程的一部分发生的-我认为在应用约束之前,您可以访问带有违规行的表。