1.语法
创建索引 stmt:
表达式:
filter-clause:
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:
索引列:
CREATE INDEX 命令包含关键字“CREATE INDEX”,后跟新索引的名称,关键字“ON”,要建立索引的先前创建的表的名称,以及表列名称和/的括号列表或用于索引键的表达式。如果包含可选的 WHERE 子句,则索引是“部分索引”。
如果存在可选的 IF NOT EXISTS 子句并且已经存在另一个同名索引,则此命令变为空操作。
可以附加到单个表的索引数量没有任意限制。索引中的列数限制为
sqlite3_limit ( SQLITE_LIMIT_COLUMN ,...) 设置的值。
使用DROP INDEX命令删除索引。
1.1. 唯一索引
如果 UNIQUE 关键字出现在 CREATE 和 INDEX 之间,则不允许重复的索引条目。任何插入重复条目的尝试都将导致错误。
出于唯一索引的目的,所有 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 整理顺序。