如何确定哪个UNIQUE索引在Oracle中强制执行PRIMARY KEY

时间:2013-03-08 10:29:26

标签: sql oracle

给定一个包含两个唯一索引的表,如下所示,如何确定哪个唯一索引对应于PRIMARY KEY,而不是该表上的其他UNIQUE索引?

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

更新

以下是运行Florin查询的结果,该查询清楚地显示哪个索引强制执行 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 个答案:

答案 0 :(得分:4)

主键可以由非唯一索引支持,因此它根本不是强制唯一性的索引,它本身就是约束。

如果针对一组列创建主键或唯一键,则默认情况下会创建唯一索引,但如果声明约束是可延迟的,则会创建非唯一索引。还可以针对由非唯一索引覆盖的一组列声明主键或唯一键,而不创建新的唯一索引。

因此,强制主键约束的支持索引的唯一性不仅仅是存在强制主键列必须为非空的NOT NULL列约束 - 两者都是在这种情况下,它是负责的主键约束。

除了列NOT NULL声明之外,你绝对应该命名所有约束。

答案 1 :(得分:4)

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

答案 2 :(得分:1)

在极少数情况下,索引列可以是PK列的超集。例如,(A,B,C)上的索引,而PK仅是(A,B)。

答案 3 :(得分:0)

如您的查询所示,主键列上只有一个索引,这里没有混淆!

IDSYS_C0029541)上的唯一索引用于强制执行主键。

在一般情况下,您可以使用USER_CONSTRAINTS视图的INDEX_NAME列来查找用于监管唯一约束或主键的索引:

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