ORA-02437: невозможно проверить <name>- первичный ключ нарушен - PullRequest
1 голос
/ 21 сентября 2009

У меня есть таблица:

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 записи с разными первичными ключами, которые также не равны нулю. У кого-нибудь есть идея, что это может быть?

Спасибо,

Peter

Ответы [ 4 ]

6 голосов
/ 21 сентября 2009

Вы должны простить определенный уровень скептицизма с нашей стороны. Потому что эта ошибка определенно указывает на повторяющееся значение.

Что вам нужно сделать, это использовать предложение 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 голосов
/ 21 сентября 2009

от здесь

Причина: вы пытались включить ограничение первичного ключа, но столбцы в первичном ключе либо содержали пустые значения или дубликаты ..

0 голосов
/ 21 сентября 2009

Я одобряю ответ APC, но, поскольку у вас, похоже, есть проблемы с его реализацией, не могли бы вы опубликовать результаты этого запроса:

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

Это даст нам (и вам) некоторое представление о проблемных ключах.

0 голосов
/ 21 сентября 2009

2 первичных ключа идентичны?

Эта ошибка обычно выдается при попытке создать / включить первичный ключ для таблицы

...