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

xt0899hw  于 2023-10-16  发布在  Oracle
关注(0)|答案(6)|浏览(323)

我有一张table:

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个条目,都有一个不同的主键,也不是空的。有人知道这是什么吗?
谢谢你,
彼得

xienkqul

xienkqul1#

我的表只包含3个条目,都有一个不同的主键,也不是空的。
你必须原谅我们的怀疑。因为该错误肯定表示重复值。
你需要做的是使用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子句添加到代码中可能有助于跟踪它。

e1xvtsh3

e1xvtsh32#

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

jxct1oxe

jxct1oxe3#

违反主要ki的主要原因是你所做的属性是空的,或者你在表中有一些重复的id或属性

create table client_master
(
client_no varchar2(6),
client_name varchar2(20),
city varchar2(25),
state varchar2(15),
pin number(6),
balance_due number(10,2));

例如,在插入值0008 Mukul NYCT NYC 199560 2500之后
0006 Rukmini bombay maharastra 100001 0
0007克里希纳马图拉涨900050 100000
0008 Mukul NYCT NYC 199560 2500
或者您的ID可为空
所以只要修改属性并设置为NOT NULL,就可以删除重复项(如果有的话

DELETE client_master  
WHERE rowid NOT IN 
  (SELECT MAX(rowid)  
FROM client_master
GROUP BY client_no,client_name,city,state,pin,balance_due);

然后你就可以将主键添加到client _no

oyjwcjzk

oyjwcjzk4#

两个主键是否相同?
当您尝试在表上创建/启用主键时,通常会引发此错误

ki0zmccv

ki0zmccv5#

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

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

这将给给予我们(和你)一些有问题的钥匙的想法。

1tuwyuhd

1tuwyuhd6#

可能存在重复值

  • 请首先运行以下SQL命令 *
SELECT MENU_ID, COUNT(*)
FROM YOUR_TABLE_NAME
GROUP BY MENU_ID
HAVING COUNT(*) > 1;
  • 在可以运行ALTER TABLE命令之后 *

相关问题