В Oracle, уникальное ограничение включает индекс неявно?

этот вопрос касается проблемы с производительностью. Например, если бы я добавил уникальное ограничение, например:

ALTER TABLE Staffs ADD CONSTRAINT test UNIQUE (Company_Name, Staff_ID);

следует добавить уникальный индекс для проблемы с производительностью?

CREATE UNIQUE INDEX test2 ON Staffs (Company_Name, Staff_ID); 

Для основного ключа я вижу, что в системной таблице dba_indexes должен быть соответствующий индекс, но я не видел эквивалента для случая единственного ограничения

+2
источник поделиться
1 ответ

"Я не видел эквивалента для случая единственного ограничения"

Хмммм, ты уверен?

SQL> create table t23
  2  (id number
  3   , col1 date)
  4  /

Table created.

SQL> alter table t23
  2  add constraint t23_uk unique (id)
  3  /

Table altered.

SQL> select index_name, uniqueness
  2  from user_indexes
  3  where table_name='T23'
  4  /

INDEX_NAME                     UNIQUENES
------------------------------ ---------
T23_UK                         UNIQUE

SQL> 

Обратите внимание, что мы можем использовать существующий индекс, и он не обязательно должен быть уникальным. Но это означает, что имя индекса может не соответствовать имени ограничения (это также будет работать для первичных ключей):

SQL> alter table t23 drop constraint t23_uk;

Table altered.

SQL> select index_name, uniqueness
  2  from user_indexes
  3  where table_name='T23'
  4  /

no rows selected

SQL> create index t23_idx on t23(id)
  2  /

Index created.

SQL> select index_name, uniqueness
  2  from user_indexes
  3   where table_name='T23'
  4  /

INDEX_NAME                     UNIQUENES
------------------------------ ---------
T23_IDX                        NONUNIQUE

SQL> alter table t23
  2  add constraint t23_uk unique (id)
  3  /

Table altered.

SQL>

Нечетный индекс обеспечивает уникальное ограничение? Да:

SQL> insert into t23 values (1, sysdate)
  2  /

1 row created.

SQL> r
  1* insert into t23 values (1, sysdate)
insert into t23 values (1, sysdate)
*
ERROR at line 1:
ORA-00001: unique constraint (APC.T23_UK) violated

SQL> drop index t23_idx 
  2  /
drop index t23_idx
           *
ERROR at line 1:
ORA-02429: cannot drop index used for enforcement of unique/primary key


SQL> 

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

SQL> select constraint_name, constraint_type, index_name
  2  from user_constraints
  3  where table_name = 'T23'
  4  /

CONSTRAINT_NAME                C INDEX_NAME
------------------------------ - ------------------------------
T23_UK                         U T23_IDX

SQL> 
+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос