Вы должны простить определенный уровень скептицизма с нашей стороны. Потому что эта ошибка определенно указывает на повторяющееся значение.
Что вам нужно сделать, это использовать предложение 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
в ваш код может помочь вам отследить его.