Отбрасывание, а затем добавление ограничения не удается в Oracle - PullRequest
6 голосов
/ 09 мая 2009

Я пытаюсь переместить ограничение первичного ключа в другой столбец в Oracle. Я попробовал это:

ALTER TABLE MY_TABLE
DROP CONSTRAINT c_name;

ALTER TABLE MY_TABLE
ADD CONSTRAINT c_name PRIMARY KEY
(
  "COLUMN_NAME"
) ENABLE;

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

Ответы [ 3 ]

11 голосов
/ 09 мая 2009

Если исходное ограничение было ограничением первичного ключа, Oracle создает индекс для применения ограничения. Этот индекс имеет то же имя, что и ограничение (C_NAME в вашем примере). Вам нужно удалить индекс отдельно от ограничения. Так что вам нужно будет сделать:

ALTER TABLE <table1> DROP CONSTRAINT C_NAME;
DROP INDEX C_NAME;

ALTER TABLE <table1> ADD CONSTRAINT C_NAME PRIMARY KEY
( COLUMN_2 ) ENABLE;
2 голосов
/ 09 мая 2009

Самый безопасный способ - сначала добавить уникальный индекс. Попробуйте это:

create unique index new_pk on <tabname> (column_2);

Тогда бросьте старый ПК:

alter table <tabname> drop primary key drop index;

(Необязательно) Переименуйте индекс:

alter index new_pk rename to c_name;

А затем снова добавьте PK, указав используемый индекс:

alter table <tabname> add constraint c_name
primary key (column_2) using index c_name;
0 голосов
/ 09 мая 2009

Я не знаю, является ли это аналогичной проблемой, но в DB2 вам нужно выполнить коммит, следуя инструкции alter table. Иначе он все еще болтается.

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