Как столбец первичного ключа может иметь повторяющиеся значения в Oracle? - PullRequest
6 голосов
/ 30 сентября 2011

Я только что попытался импортировать базу данных Oracle в другую, и она выдала ошибку, сообщающую, что дублированные значения найдены в столбце первичного ключа.Затем я проверил исходную таблицу, и да, действительно, в PK есть повторяющиеся значения, и проверил, что PK включен и работает нормально.Теперь мне интересно, как это может произойти.

Редактировать: я обнаружил, что индекс находится в непригодном для использования состоянии.Я не знаю, как это случилось, просто нашел это: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1859798300346695894

Ответы [ 6 ]

7 голосов
/ 30 сентября 2011

Предполагая, что ваш первичный ключ действительно определен в этом столбце и включен, вы можете проверить, проверен ли он. Только проверенные ограничения гарантируются Oracle как истинные для всех строк.

Вот сценарий с непроверенным первичным ключом с повторяющимся значением:

SQL> DROP TABLE t;     
Table dropped

SQL> CREATE TABLE t (ID NUMBER);     
Table created

SQL> INSERT INTO t VALUES (1);     
1 row inserted

SQL> INSERT INTO t VALUES (1);     
1 row inserted

SQL> CREATE INDEX t_id_idx ON t(ID);     
Index created

SQL> ALTER TABLE t ADD CONSTRAINT pk_id PRIMARY KEY (ID) NOVALIDATE;     
Table altered

SQL> SELECT * FROM t;

        ID
----------
         1
         1

SQL> SELECT constraint_type, status, validated
  2    FROM user_constraints
  3   WHERE constraint_name = 'PK_ID';

CONSTRAINT_TYPE STATUS   VALIDATED
--------------- -------- -------------
P               ENABLED  NOT VALIDATED

Обновление:

Одно вероятное объяснение заключается в том, что прямая загрузка пути (из SQL * Loader) оставила ваш уникальный индекс в непригодном для использования состоянии с дублированными первичными ключами.

0 голосов
/ 12 апреля 2012

Использование отложенных ограничений может привести к вставке повторяющихся значений в столбец PK.

Проверьте ссылку ниже. Он описывает возможную ошибку Oracle, которая может привести к дублированию значений первичного ключа. Я только что воссоздал проблему в Oracle 11g EE Rel 11.2.0.2.0

http://www.pythian.com/news/9881/deferrable-constraints-in-oracle-11gr2-may-lead-to-logically-corrupted-data/

0 голосов
/ 30 сентября 2011

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

Была ли загрузка данных в последнее время? Есть ли в таблице какие-либо столбцы аудита, например, дата создания, чтобы определить, являются ли все строки дубликатами?

0 голосов
/ 30 сентября 2011

Вы вставили данные дважды

OR

Таблица назначения не пуста.

OR

Вы определили другой pk для таблицы dest.

0 голосов
/ 30 сентября 2011

Убедитесь, что у вас настроен индекс как уникальный.

select table_name,uniqueness,index_name from all_indexes where table_name='[table_name]';


/* shows you the columns that make up the index */
select * from all_ind_columns where index_name='[index_name]';
0 голосов
/ 30 сентября 2011

Столбец, который, по вашему мнению, применяется pk, но в действительности это ваша ошибка. PK не определен в этом столбце ...

Или

Вы применили первичный ключ Composite / Multi column. Попробуйте вставить одну и ту же запись дважды, это показывает ошибку, что означает составной ключ ..

...