2015-10-14 29 views
1

我正在使用數據庫,並被告知表USERS有一個主鍵 - USERID。使用ALL_CONS_COLS給了我下面的:Oracle:查找主鍵 - PK和NN

OWNER | TABLE_NAME | CONSTRAINT_NAME | COLUMN_NAME | POSITION 
---------------------------------------------------------------- 
MONSTER | USERS | USER_ID_PK | USERREF | 2 
MONSTER | USERS | USER_ID_NN | USERID 
MONSTER | USERS | USER_ID_PK | USERID | 1 

這表明PK是由複合:USERREFUSERID

有幾件事情我不明白:

爲什麼USERID既有NOT NULL約束,也是一個PK約束?根據定義,PK表示NN。 其次,由於USERIDNN約束,爲什麼USERREF沒有NN約束? 第三,爲什麼CONSTRAINT_NAME「暗示」PKUSER_IDUSERID),即爲什麼是以單個列命名的約束; USERS_PK會不會是一個更好的約束名稱?

因此,最終是不是合成PK

+0

俺們這些問題大部分都是(可能):因爲有人用這種方式創建它(特別是名稱和NN約束) –

+0

謝謝!那麼它是一個複合'PK'? – monster

回答

2

那麼,最終它是一個複合PK還是不是?

是。主鍵一起定義在兩列上。該職位將告訴你領導專欄。 USER_ID_PK主鍵約束在USERID上定義爲領先列,然後是USERREF

爲什麼USERID同時具有NOT NULL約束和PK約束?

因爲有人在主鍵列創建NOT NULL約束明確。

讓我們來看看。

單主鍵

SQL> create table t(a number primary key); 

Table created. 

SQL> SELECT a.table_name, 
    2 b.column_name, 
    3 a.constraint_type, 
    4 b.position 
    5 FROM user_constraints a 
    6 JOIN user_cons_columns b 
    7 ON a.owner    = b.owner 
    8 AND a.constraint_name = b.constraint_name 
    9 AND a.table_name  = b.table_name 
10 AND a.constraint_type IN ('P', 'C'); 

TABLE_NAME COLUMN_NAM C POSITION 
---------- ---------- - ---------- 
T   A   P   1 

複合主鍵

SQL> drop table t purge; 

Table dropped. 

SQL> create table t(a number, b number); 

Table created. 

SQL> alter table t add constraint t_pk PRIMARY KEY(a, 

Table altered. 

SQL> SELECT a.table_name, 
    2 b.column_name, 
    3 a.constraint_type, 
    4 b.position 
    5 FROM user_constraints a 
    6 JOIN user_cons_columns b 
    7 ON a.owner    = b.owner 
    8 AND a.constraint_name = b.constraint_name 
    9 AND a.table_name  = b.table_name 
10 AND a.constraint_type IN ('P', 'C'); 

TABLE_NAME COLUMN_NAM C POSITION 
---------- ---------- - ---------- 
T   A   P   1 
T   B   P   2 

主鍵和NOT NULL

SQL> drop table t purge; 

Table dropped. 

SQL> create table t(a number primary key not null); 

Table created. 

SQL> SELECT a.table_name, 
    2 b.column_name, 
    3 a.constraint_type, 
    4 b.position 
    5 FROM user_constraints a 
    6 JOIN user_cons_columns b 
    7 ON a.owner    = b.owner 
    8 AND a.constraint_name = b.constraint_name 
    9 AND a.table_name  = b.table_name 
10 AND a.constraint_type IN ('P', 'C'); 

TABLE_NAME COLUMN_NAM C POSITION 
---------- ---------- - ---------- 
T   A   C 
T   A   P   1 
+0

什麼是_leading column_它有什麼作用(如果有的話)? – monster

+0

「領先專欄」我指的是在這方面的第一欄。但是,它在連接(複合)索引中具有重要意義。它超出了你的問題的範圍。不過,如果您有興趣,請瀏覽http://www.orafaq.com/tuningguide/concatenated%20indexes.html –