我有一张桌子:
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个条目,所有条目都有不同的主键,也不是空的。 任何人都知道这可能是什么?
谢谢,
彼得
答案 0 :(得分:6)
你必须原谅我们一定程度的怀疑。因为该错误肯定表示重复值。
您需要做的是使用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
子句添加到代码中可能有助于您跟踪它。
答案 1 :(得分:2)
来自here
原因:您试图尝试启用 主键约束,但是 主键中的列也是 包含NULL值或重复..
答案 2 :(得分:0)
2个主键是否相同?
当您尝试在表上创建/启用主键时,通常会抛出此错误
答案 3 :(得分:0)
我正在推动APC的回答,但由于您似乎在实施它时遇到了一些问题,您是否可以发布此查询的结果:
select my_id, count(*) from my_table group by my_id having count(*) >1
这会让我们(和你)了解有问题的密钥。