我在SQLite中的整数数据列上使用自动递增。由于它是自动递增的,因此该列已经按升序对数据进行了排序。因此,我想知道SQLite是否会在该列搜索数据时对自动增量列执行二进制搜索。
答案 0 :(得分:1)
实际上是,但不是真的。
也就是说, AUTOINCREMENT 所做的全部操作就是添加一个约束,该约束要求分配给该列的值必须大于该列中的任何现有值或已使用的任何值。
但是your_column INTEGER PRIMARY KEY
还不止这些。(AUTOINCREMENT只能在这样的列上使用,并且每个表只能有1个这样的列)使该列成为别名隐藏的行列中。
rowid 是被索引的对象,基本上是最主要和最有效的索引,除非使用WITHOUT ROWID关键字定义了表,否则该索引始终存在。
因此, AUTOINCREMENT 列是 rowid 列的别名,并且使用不同于别名的更昂贵算法> rowid 而没有自动增加。
如果没有 AUTOINCREMENT ,则为 rowid 列生成的值将在表中找到最大值并将其递增。除非该值超过922337203685477575,否则SQlite会尝试查找未使用的较低值(通常在1到9223372036854775807之间)。
使用 AUTOINCREMENT 时,算法采用最大值的最大值和相应表中存储在表 sqlite_sequence 中的值,并使用该值(因此,任何删除的较高值将不可重复使用)。但是,如果使用了9223372036854775807,则会出现 SQLITE_FULL 错误。
应注意以下几点:-
AUTOINCREMENT关键字强加了额外的CPU,内存,磁盘空间和 磁盘I / O开销,如果没有严格要求,则应避免。它是 通常不需要。
SQLite Autoincrement,您可能想读一遍。
回复评论:-
如果我不使用AUTOINCREMENT,则必须明确创建唯一 整数ID,然后在每次有新行插入时将其插入数据库中 插入。
以下内容表明不需要AUTOINCREMENT:-
CREATE TABLE IF NOT EXISTS xyz (ID INTEGER PRIMARY KEY);
INSERT INTO xyz VALUES(null);
SELECT * FROM xyz;
运行两次后,结果是:-