2013-03-08 100 views
1

給定一個包含兩個唯一索引的表(如下所示),如何確定哪個唯一索引對應於PRIMARY KEY,而不是該表上的其他UNIQUE索引?如何確定哪個UNIQUE索引在Oracle中實施PRIMARY KEY

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 

更新:

下面是運行弗羅林的查詢,這清楚地表明該指數強制執行P RIMARY KEY的結果:

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 2013-03-08 10:46:27

4

主鍵可以通過支持非唯一索引,所以它不是真正的強制唯一性的索引,它本身就是約束。

如果您針對一組列創建主鍵或唯一鍵,那麼默認情況下會創建一個唯一索引,除非如果約束被聲明爲可延遲,那麼將創建一個非唯一索引。主鍵或唯一鍵也可以針對非唯一索引覆蓋的一組列進行聲明,而不創建新的唯一索引。

因此,支持索引的唯一性不是強制執行主鍵約束,而是存在強制主鍵列必須非空的NOT NULL列約束。這兩種情況都是主要的約束本身。

除了列NOT NULL聲明之外,您應該明確指出您的所有約束。

+0

對不起,但除非我錯了,主鍵應該強制行的身份,因此意味着唯一性(也看起來不是無效)。那麼你能否確定你的第一句話是什麼意思? – ddevienne 2013-03-08 10:56:26

+0

是的,但他們自己並沒有通過獨特的索引。 – 2013-03-08 11:51:06

+0

我已經更仔細地重讀了你的答案,這一次我明白了。感謝這個精度。這對我來說很有啓發。 – ddevienne 2013-03-08 12:24:06

0

正如您的查詢所顯示的那樣,您在主鍵列上只有一個索引,這裏沒有任何混淆!

IDSYS_C0029541)上的唯一索引用於強制執行主鍵。

在一般情況下,你可以使用USER_CONSTRAINTS視圖的INDEX_NAME欄裏找到用於監管的唯一約束或主鍵索引:

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

我的問題的關鍵是推斷PRIMARY KEY的索引,如果有的話,不知道PK列的先驗。所以你的第一句話對我來說沒有意義:)。但是,您的查詢確實回答了我的問題,謝謝。 – ddevienne 2013-03-08 10:53:25

1

在極少數情況下,索引的列可以PK的專欄的超集。例如(A,B,C)上的索引,而PK僅爲(A,B)。