1. 語法
create-index-stmt
expr
filter-clause
function-arguments
ordering-term
literal-value
over-clause
frame-spec
ordering-term
raise-function
select-stmt
common-table-expression
compound-operator
join-clause
join-constraint
join-operator
ordering-term
result-column
table-or-subquery
window-defn
frame-spec
type-name
signed-number
indexed-column
CREATE INDEX 指令包含關鍵字「CREATE INDEX」,後接新索引的名稱、關鍵字「ON」、要建立索引的先前建立資料表的名稱,以及用於索引鍵的資料表欄位名稱和/或運算式的括號清單。如果包含 WHERE 子句,則索引為「部分索引」。
如果存在 IF NOT EXISTS 子句,且已存在具有相同名稱的另一個索引,則此指令會變成無作用。
附加到單一資料表的索引數量沒有任意限制。索引中的欄位數量限制為 sqlite3_limit(SQLITE_LIMIT_COLUMN,...) 設定的值。
使用 DROP INDEX 指令移除索引。
1.1. 唯一索引
如果 CREATE 和 INDEX 之間出現 UNIQUE 關鍵字,則不允許重複索引項目。嘗試插入重複項目會導致錯誤。
針對唯一索引的目的,所有 NULL 值都視為不同於其他所有 NULL 值,因此是唯一的。這是 SQL-92 標準的兩種可能詮釋之一(標準中的語言含糊不清)。SQLite 使用的詮釋相同,而 PostgreSQL、MySQL、Firebird 和 Oracle 也遵循此詮釋。Informix 和 Microsoft SQL Server 則遵循標準的另一種詮釋,即所有 NULL 值都相等。
1.2. 表達式索引
索引中的表達式不得參照其他表格,也不得使用子查詢或其結果可能變更的函數(例如:random() 或 sqlite_version())。索引中的表達式只能參照正在索引的表格中的欄位。表達式索引不適用於 版本 3.9.0(2015-10-14)之前的 SQLite 版本。請參閱 表達式索引 文件,以取得有關在 CREATE INDEX 陳述式中使用一般表達式的其他資訊。
1.3. 遞減索引
每個欄位名稱或表達式後面都可以加上「ASC」或「DESC」關鍵字之一,以表示排序順序。排序順序可能會被忽略,也可能不會被忽略,這取決於資料庫檔案格式,特別是 架構格式編號。「舊版」架構格式 (1) 會忽略索引排序順序。遞減索引架構格式 (4) 會考量索引排序順序。只有 SQLite 3.3.0(2006-01-11)和後續版本才能理解遞減索引格式。為了相容性,3.3.0 到 3.7.9 之間的 SQLite 版本預設使用舊版架構格式。較新的架構格式在 3.7.10(2012-01-16)和後續版本中預設使用。legacy_file_format pragma 可用於變更任何 SQLite 版本的特定行為。
1.4. NULLS FIRST 和 NULLS LAST
NULLS FIRST 和 NULLS LAST 謂詞不支援索引。對於排序目的,SQLite 視 NULL 值小於所有其他值。因此,NULL 值總是出現在 ASC 索引的開頭和 DESC 索引的結尾。
1.5. 校對
每個欄位名稱或表達式後面的 COLLATE 子句(可選)定義用於該欄位中文字條目的校對順序。預設的校對順序是 CREATE TABLE 陳述式中為該欄位定義的校對順序。或者,如果沒有定義其他校對順序,則使用內建的 BINARY 校對順序。