给定一个包含两个唯一索引的表,如下所示,如何确定哪个唯一索引对应于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
答案 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)
如您的查询所示,主键列上只有一个索引,这里没有混淆!
列ID
(SYS_C0029541
)上的唯一索引用于强制执行主键。
在一般情况下,您可以使用USER_CONSTRAINTS
视图的INDEX_NAME
列来查找用于监管唯一约束或主键的索引:
SELECT constraint_name, index_name, constraint_type
FROM user_constraints
WHERE table_name = 'TT';