小巧。快速。可靠。
三选二。
创建索引

1. 语法

create-index-stmt

CREATE UNIQUE INDEX IF NOT EXISTS schema-name . index-name ON table-name ( indexed-column ) , WHERE expr

表达式

索引列

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())。索引中的表达式只能引用正在建立索引的表中的列。表达式上的索引不适用于 SQLite 3.9.0 之前的版本 (版本 3.9.0 (2015-10-14))。有关在 CREATE INDEX 语句中使用常规表达式的更多信息,请参阅 表达式上的索引 文档。

1.3. 降序索引

每个列名称或表达式后面可以跟“ASC”或“DESC”关键字之一以指示排序顺序。排序顺序可能会被忽略,也可能不会被忽略,具体取决于数据库文件格式,特别是 模式格式编号。“旧版”模式格式 (1) 忽略索引排序顺序。降序索引模式格式 (4) 会考虑索引排序顺序。只有 SQLite 3.3.0 (2006-01-11) 及更高版本才能理解降序索引格式。为了兼容性,SQLite 3.3.0 到 3.7.9 之间的版本默认使用旧版模式格式。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 排序规则。