1. 语法
create-index-stmt
表达式
过滤子句
函数参数
排序项
字面量值
over 子句
窗口规范
排序项
引发函数
选择语句
公共表表达式
复合运算符
连接子句
连接约束
连接运算符
排序项
结果列
表或子查询
窗口定义
窗口规范
类型名称
带符号数字
索引列
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 排序规则。