首页 文章

在Oracle SQL中声明主键上的附加索引时会发生什么?

提问于
浏览
1

我有一个很多部分的问题:

我的旅程开始于我试图弄清楚我是否可以在Oracle SQL中使用降序/升序主键 .

似乎没有 CREATE TABLE MYTAB (ID INT PRIMARY KEY DESC);CREATE TABLE MYTAB (ID INT, CONSTRAINT PK PRIMARY KEY(ID DESC)); 的语法

后来我了解到,Oracle隐式地为主键创建了一个索引,以帮助强制执行其约束 . 我想我可以为它创建一个索引,并使索引下降 .

CREATE INDEX MYIND ON MYTAB (ID DESC);

这很有效,当我查询哪些索引时,我得到了这个:

> SELECT INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME = 'MYTAB';

INDEX_NAME
------------------------------
SYS_C0011939
MYIND

我看到隐式创建的索引以及我自己的索引......我试图通过在表创建期间创建主键的索引来查看是否可以删除隐式创建的索引:

CREATE TABLE MYTAB (ID INT PRIMARY KEY USING INDEX (CREATE INDEX MYIND ON MYTAB (ID ASC)));

这有效:

> SELECT INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME = 'MYTAB';

INDEX_NAME
------------------------------
MYIND

有趣的是,使用DESC作为索引方向会给我以下错误:

Specified index cannot be used to enforce the constraint.


所以我的问题是:

  • 这是否意味着在Oracle SQL中无法使用DESCENDING主键?

  • 如果是这样,为什么DESC不允许执行主键约束?

  • 在我的第一个例子中,分别创建索引的行为/效果究竟是什么? DESC在那里工作......当主键上有两个索引时会发生什么?它的功能是否与另一个DB允许DESC作为主键规范的一部分相同?

1 回答

  • 1

    Oracle将索引创建为双链表,以便在需要时可以按升序或降序遍历每个索引 .

    但是,对于 multi-column 索引,可以添加 DESC 关键字,以便相对于其他列按降序存储一个或多个列 .

    这有用性有限并且不经常使用 - 但是当您创建一个专门用于支持特定查询中特定 ORDER BY 子句的索引时,它可能很有用,其中某些(但不是全部)列按降序排序 .

相关问题