1

给定一个具有两个唯一索引的表,如下所示,如何确定哪个唯一索引对应于 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查询的结果,它清楚地显示了哪个索引强制执行主键:

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

4 回答 4

5
select 
   owner, constraint_name, table_name, index_name 
from 
   user_constraints 
where constraint_type in ('P');
于 2013-03-08T10:37:45.943 回答
4

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

如果您针对一组列创建主键或唯一键,则默认情况下会创建唯一索引,除非将约束声明为可延迟,然后创建非唯一索引。还可以针对由非唯一索引覆盖的一组列声明主键或唯一键,而无需创建新的唯一索引。

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

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

于 2013-03-08T10:36:14.613 回答
1

In rare cases indexes columns can be a superset of PK's columns. For example index on (A, B, C) while PK is only (A, B).

于 2013-03-08T10:59:06.030 回答
0

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

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

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

SELECT constraint_name, index_name, constraint_type
  FROM user_constraints
 WHERE table_name = 'TT';
于 2013-03-08T10:37:20.033 回答