Answers:
除了INTEGER PRIMARY KEY列外,UNIQUE和PRIMARY KEY约束都通过在数据库中创建索引来实现(与“ CREATE UNIQUE INDEX”语句的方式相同)。像数据库中的任何其他索引一样,使用这种索引来优化查询。结果,在已经集体受到UNIQUE或PRIMARY KEY约束的一组列上创建索引时,通常没有任何优势(但是开销很大)。
sqlite_master
表格中提到的名称以开头sqlite_autoindex_
。
SQL Data Constraints
这里的部分说:在大多数情况下,UNIQUE和PRIMARY KEY约束是通过在数据库中创建唯一索引来实现的。(例外是WITHOUT ROWID表上的INTEGER PRIMARY KEY和PRIMARY KEY。)那么答案并不总是正确的吗?
如果将列标记为INTEGER PRIMARY KEY,则实际上它的速度大约是通过指定任何其他PRIMARY KEY或索引值进行的类似搜索的两倍。这是因为:
... SQLite表中的所有行都有一个64位带符号整数键,可唯一标识其表中的行...搜索具有特定rowid的记录,或搜索具有指定范围内的rowid的所有记录的时间大约是原来的两倍。与通过指定任何其他PRIMARY KEY或索引值进行的类似搜索一样快。
除了下面提到的一个例外,如果rowid表的主键由单个列组成,并且该列的声明类型为大写和小写的“ INTEGER”,则该列将成为rowid的别名。
此类列通常称为“整数主键”。仅当声明的类型名称恰好是“ INTEGER”时,PRIMARY KEY列才成为整数主键。其他整数类型名称(例如“ INT”或“ BIGINT”或“ SHORT INTEGER”或“ UNSIGNED INTEGER”)会导致主键列的行为与具有整数相似性和唯一索引的普通表列相同,而不是作为rowid的别名。