2010-07-31 159 views
101

当一个整数列被标记为SQLite表中的主键时,是否应该为它明确创建一个索引? SQLite似乎没有为主键列自动创建一个索引,但是它的目的可能是索引它呢? (我会一直在这个专栏上搜索)。SQLite中的主键是否需要索引?

字符串主键的情况会不同吗?

回答

112

It does it for you.

INTEGER主键列之外,既独特又PRIMARY KEY 约束通过在数据库中创建一个索引来实现(在 以同样的方式为 “CREATE UNIQUE INDEX” 将语句)。这样的 索引与数据库中的任何其他索引一样用于优化 查询。因此,在一组已经使用UNIQUE或PRIMARY KEY约束的列已经创建索引的情况下,通常没有任何优势(但重要的开销)。

+5

事实上,它说:“主键属性通常产生于被指定作为主键列或列的唯一索引”。但是,该索引在SQLite管理应用程序中不可见,这就是为什么我问。 – 2010-07-31 18:26:11

+1

在'sqlite_master'表中提及名称以'sqlite_autoindex_'开头的表。 – dan04 2010-07-31 19:17:14

+1

这意味着,与mysql不同的是,当您创建外键时,您经常需要添加索引。是吗 ? – 2012-06-19 10:16:43

7

数据库将始终静默地为唯一主键创建索引,以便在内部检查它是否有效。

创建它后,它会在必要时使用它。

当然,它不会总是聚集在一起,并且如果您希望它通常在模式中指定。

7

如果一列标记为INTEGER PRIMARY KEY,实际上它大约是通过指定任何其他PRIMARY KEY或索引值进行的类似搜索的左右。这是因为:

... SQLite表中的所有行都有一个64位有符号整数键,用于唯一标识其表中的行...搜索具有特定rowid或所有记录的记录在指定范围内的rowid大约是通过指定任何其他PRIMARY KEY或索引值进行的类似搜索的两倍。

有一个例外下文指出,如果一个rowid表具有主密钥由单个列和该列的声明的类型是在上部和下部壳体的任何混合物“INTEGER”则列成为rowid的别名。

这样的列通常被称为“整数主键”。 A 如果声明的 类型名称完全是“INTEGER”,则PRIMARY KEY列只能成为整数主键。其他整数类型名称(如“INT”或 “BIGINT”或“SHORT INTEGER”或“UNSIGNED INTEGER”)会导致主键 的行为与具有整数关联性 和唯一索引的普通表列不同, rowid。

参见:http://www.sqlite.org/lang_createtable.html#rowid

相关问题