2017-09-11 63 views
1

我有一個多部分問題:在Oracle SQL中的主鍵上聲明附加索引時會發生什麼?

我的旅程開始時,我試圖找出是否可以在Oracle SQL中降序/升序主鍵。

似乎有不沿着CREATE TABLE MYTAB (ID INT PRIMARY KEY DESC);CREATE TABLE MYTAB (ID INT, CONSTRAINT PK PRIMARY KEY(ID DESC));

後來我才知道甲骨文暗中創建主鍵,以幫助加強其約束指數的行,以語法。我想我可以爲它創建一個索引,並使索引下降。

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.


所以我的問題是:

  1. 這是否意味着DESCENDING主鍵在Oracle SQL中不可行?
  2. 如果是這樣,爲什麼DESC不允許執行主鍵約束?
  3. 創建一個索引的行爲/效果究竟與我的第一個示例一樣? DESC在那裏工作......主鍵有兩個索引時會發生什麼?它的功能與另一個DB允許將DESC作爲主鍵規範的一部分的方式相同嗎?
+1

爲什麼你認爲你需要一個DESC索引? –

+0

我正在寫一個工具,將爲一堆不同的數據庫生成語句 - 我正在研究允許用戶指定升序/降序選項,並查看每個不同的數據庫實現如何處理升序/降序索引。看起來像甲骨文沒有必要像你說的那樣 – Grandclosing

回答

1

Oracle將索引創建爲雙鏈表,以便每個索引可以在需要時按升序或降序遍歷。

對於多列索引,但是,您可以添加DESC關鍵字以使一列或多列相對於其他列以降序存儲。

這樣做的用處有限,並且經常不常用 - 但在創建索引時專門用於支持特定查詢中的某個特定查詢(其中一些(但不是全部)列按降序排序)可能非常有用。

相關問題