Ошибка при создании уникального индекса в Oracle: ORA-01452 - PullRequest
0 голосов
/ 30 марта 2019

В моей таблице был составной уникальный индекс, но по деловым причинам мне пришлось убрать один из столбцов из индекса. Поэтому я опустил индекс. Теперь, с уменьшенным количеством столбцов, он создает ошибку при создании индекса: ORA-01452: не может CREATE UNIQUE INDEX; найдены повторяющиеся ключи.

Ранее в индексе был дополнительный столбец, и все работало нормально.

CREATE UNIQUE INDEX MGRRS.ITRCHESS ON MGRRS.TTRCHESS (MHYSTU, MAJUSDESK, DATSNAQ, TIMESSDG)  TABLESPACE IMGRRS  LOCAL
                                            *
ERROR at line 1:
ORA-01452: cannot CREATE UNIQUE INDEX; duplicate keys found

Примечание 1: Обратите внимание, что я не убрал столбец из таблицы.

Ответы [ 3 ]

2 голосов
/ 30 марта 2019

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

Что произошло в вашем случаеявляется то, что вы удалили столбец из индекса "по деловым причинам" .Это означает, что вы потеряли столбец, который дал вам уникальные комбинации.Следовательно, вы не можете создать уникальный индекс для оставшихся четырех столбцов.

Ваши параметры:

  1. Восстановить удаленный столбец в индексе.Это может быть непрактичным, в зависимости от бизнес-драйвера, который приводит к этой ситуации.
  2. Определите записи, которые имеют общие комбинации , как @PhilippeMarschall показывает , и обновите или удалите их.Похоже, что это наименее желательный вариант.
  3. Создайте неуникальный индекс, если вам что-то нужно из соображений производительности.Вам следует запустить несколько тестов.
  4. Не беспокойтесь об индексе.Сделайте это, если индекс не удовлетворяет требованию к производительности.

Это такая же политическая проблема, как и техническая.Похоже, что кто-то выдвинул предложение - «Джей из Маркетинга говорит, что мы должны исключить COLUMN_23 из индекса» - но анализ воздействия, все другие вещи, которые необходимо изменить, не был завершен должным образом,

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

1 голос
/ 30 марта 2019

У вас есть дубликаты данных, вы можете найти их, используя

SELECT MHYSTU, MAJUSDESK, DATSNAQ, TIMESSDG
FROM MGRRS.ITRCHESS
GROUP BY MHYSTU, MAJUSDESK, DATSNAQ, TIMESSDG
HAVING COUNT(1) > 1
0 голосов
/ 30 марта 2019

ORA-01452 означает, что комбинация полей, предлагаемых для индекса, не является уникальной.Вы не можете создать УНИКАЛЬНЫЙ индекс для комбинации столбцов, которая не является уникальной.

У вас изначально было пять столбцов в индексе, и комбинация этих столбцов была уникальной.

Вы удалили один изполя из индекса.Теперь комбинация из четырех полей в индексе (MHYSTU, MAJUSDESK, DATSNAQ, TIMESSDG) не является уникальной.

Ваш выбор:

  1. Поместите поле, которое вы удалили, обратно виндекс.
  2. Удалите слово UNIQUE из определения индекса:

    CREATE INDEX MGRRS.ITRCHESS ON MGRRS.TTRCHESS (MHYSTU, MAJUSDESK, DATSNAQ, TIMESSDG) TABLESPACE IMGRRS LOCAL

  3. Удалите строки из таблицы так,что в таблице есть только одна строка для каждой комбинации (MHYSTU, MAJUSDESK, DATSNAQ, TIMESSDG).

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...