在 Oracle SQL 的主键上声明附加索引时会发生啥?
Posted
技术标签:
【中文标题】在 Oracle SQL 的主键上声明附加索引时会发生啥?【英文标题】:What happens when declaring an additional index on the primary key in Oracle SQL?在 Oracle SQL 的主键上声明附加索引时会发生什么? 【发布时间】:2017-09-11 20:04:41 【问题描述】:我有一个多部分的问题:
当我试图弄清楚我是否可以在 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 在那里工作......当主键上有两个索引时会发生什么?它的功能是否与另一个数据库允许 DESC 作为主键规范的一部分相同?
【问题讨论】:
您认为为什么需要 DESC 索引? 我正在编写一个工具,它将为一堆不同的数据库生成语句 - 我正在研究允许用户指定升序/降序选项,并查看每个不同的数据库实现如何处理升序/降序指数。看来甲骨文不需要你说的 【参考方案1】:Oracle 将索引创建为双链表,以便在需要时可以按升序或降序遍历每个索引。
但是,对于多列索引,您可以添加DESC
关键字,以使一个或多个列相对于其他列按降序存储。
它的用处有限且不经常使用 - 但当您专门创建索引以支持特定查询中的特定 ORDER BY
子句时,它可能很有用,其中某些(但不是全部)列按降序排序.
【讨论】:
以上是关于在 Oracle SQL 的主键上声明附加索引时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章