Ответ 1
У вас есть индекс, который использовался этим ограничением? Потому что, если вы не включили предложение DROP INDEX
, когда вы отбросили ограничение, оно все равно будет там. Начните с
SELECT *
FROM user_indexes
WHERE index_name = 'PK_USERSAPPLICATIONS'
/
В качестве альтернативы
select index_name
from user_indexes
where table_name = 'USERSAPPLICATIONS'
and uniqueness='UNIQUE'
/
или
select index_name
from user_ind_columns
where table_name = 'USERSAPPLICATIONS'
and column_name in ('USERID' ,'APPLICATIONNAME')
/
изменить
Доказательство концепции
SQL> create table t23 (id number not null, alt_key varchar2(10) not null)
2 /
Table created.
SQL> create unique index t23_idx on t23 (id)
2 /
Index created.
SQL> alter table t23 add constraint t23_pk primary key (id) using index
2 /
Table altered.
SQL> insert into t23 values (1, 'SAM I AM')
2 /
1 row created.
SQL> insert into t23 values (1, 'MR KNOX')
2 /
insert into t23 values (1, 'MR KNOX')
*
ERROR at line 1:
ORA-00001: unique constraint (APC.T23_PK) violated
SQL>
Таким образом, ограничение работает. Что произойдет, если мы опустим его без предложения DROP INDEX?
SQL> alter table t23 drop constraint t23_pk
2 /
Table altered.
SQL> insert into t23 values (1, 'MR KNOX')
2 /
insert into t23 values (1, 'MR KNOX')
*
ERROR at line 1:
ORA-00001: unique constraint (APC.T23_IDX) violated
SQL>
Обратите внимание на незначительное изменение сообщения об ошибке. Второй отказ ссылается на имя индекса, тогда как исходное сообщение ссылается на ограничение. Если имя индекса совпадает с именем ограничения, было бы трудно диагностировать это.
Если вы явно не создаете уникальный индекс, поведение по умолчанию по умолчанию Oracle - это создание неидеального индекса. Следовательно, отказ от ограничения без снижения индекса не вызывает этой проблемы. (Предостерегайте, что это поведение относится к 11 г. Я полагаю, но не могу быть уверенным, что это также в предыдущих версиях).