2013-03-08 4 views
1

Учитывая таблицу с двумя уникальными индексами, как показано ниже, как определить, какой уникальный индекс соответствует PRIMARY KEY, в отличие от других индексов UNIQUE в этой таблице?Как определить, какой UNIQUE-индекс применяет PRIMARY KEY в Oracle

Пользователь user_indexes и user_ind_columns, похоже, несут эту информацию. Спасибо, --DD

PS: За исключением явного указания индексов и использования соглашения об именах, конечно.

SQL> create table tt (id number not null primary key, name varchar2(64 char) not null unique, info varchar2(4000)); 

SQL> create index tt_idx on tt(info); 

SQL> select INDEX_NAME, INDEX_TYPE, UNIQUENESS from user_indexes where TABLE_NAME='TT'; 

INDEX_NAME   INDEX_TYPE     UNIQUENES 
-------------------- --------------------------- --------- 
SYS_C0029541   NORMAL      UNIQUE 
SYS_C0029542   NORMAL      UNIQUE 
TT_IDX    NORMAL      NONUNIQUE 

SQL> select * from user_ind_columns where TABLE_NAME='TT'; 

INDEX_NAME   TABLE_NAME   COLUMN_NAME COLUMN_POSITION COLUMN_LENGTH CHAR_LENGTH DESC 
-------------------- -------------------- ------------ --------------- ------------- ----------- ---- 
SYS_C0029541   TT     ID       1   22   0 ASC 
SYS_C0029542   TT     NAME      1   256   64 ASC 
TT_IDX    TT     INFO      1   4000  4000 ASC 

Update:

Вот результат выполнения запроса Флорин, который ясно показывает, какой индекс усиливает P RIMARY КЛЮЧ:

SQL> select constraint_name, constraint_type, index_name from user_constraints where table_name='TT'; 

CONSTRAINT_NAME    C INDEX_NAME 
------------------------------ - -------------------- 
SYS_C0029539     C 
SYS_C0029540     C 
SYS_C0029541     P SYS_C0029541 
SYS_C0029542     U SYS_C0029542 

ответ

4
select 
    owner, constraint_name, table_name, index_name 
from 
    user_constraints 
where constraint_type in ('P'); 
+0

Спасибо. --DD – ddevienne

4

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

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

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

Вы должны определенно назвать все свои ограничения, хотя, кроме объявлений NOT NULL.

+0

Прошу прощения, но если я ошибаюсь, первичные ключи должны обеспечивать идентификацию строки, что поэтому подразумевает уникальность (и не-нулевость тоже кажется). Так можете ли вы уточнить, что вы подразумеваете под первым предложением? – ddevienne

+0

Да, они делают это, но сами делают это не благодаря наличию уникального индекса. –

+0

Я перечитал ваш ответ более внимательно, и на этот раз я получил его. Спасибо за эту точность. Это поучительно для меня. – ddevienne

0

Как показывает ваш запрос, у вас есть только один индекс в столбце первичного ключа, здесь нет путаницы!

Уникальный индекс в столбце ID (SYS_C0029541) используется для принудительного ввода первичного ключа.

В общем случае вы можете использовать INDEX_NAME столбец USER_CONSTRAINTS зрения, чтобы найти индекс, используемый для полиции ограничение уникальности или первичный ключ:

SELECT constraint_name, index_name, constraint_type 
    FROM user_constraints 
WHERE table_name = 'TT'; 
+0

вопрос моего вопроса заключался в том, чтобы указать индекс PRIMARY KEY, если таковой имеется, не зная a-priori, который является/является столбцом PK. Поэтому ваше первое предложение не имеет для меня никакого смысла :). Но ваш запрос ответил на мой вопрос, хотя, спасибо. – ddevienne

1

В редких случаях индексы столбцов могут быть надмножество столбцов ПК. Например, индекс на (A, B, C), а PK - только (A, B).

Смежные вопросы