创建索引

1.语法

创建索引 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())。索引中的表达式只能引用被索引的表中的列。表达式索引不适用于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 整理顺序。