首页 > 解决方案 > 如果我在列上使用 SQLite 自动增量,它会自动维护该列的索引吗?

问题描述

我在 SQLite 的整数数据列上使用自动增量。由于它是自动递增的,因此数据已经按该列按升序排序。所以,我想知道 SQLite 是否会在自动增量列搜索数据时对该列执行二进制搜索。

标签: sqldatabasesqliterdbms

解决方案


实际上是的,但不是真的。

也就是说,AUTOINCREMENT所做的只是添加一个约束,该约束要求分配给该列的值高于该列中的任何现有值,或高于该列中已使用的任何值。

但它的意义远不止于此your_column INTEGER PRIMARY KEY (AUTOINCREMENT 只能用于这样的列,并且每个表只能有 1 个这样的列)使该列成为隐藏的rowid列的别名。

rowid是被索引的,并且基本上是最主索引和最有效的,除非使用 WITHOUT ROWID 关键字定义表,否则它始终存在。

因此,AUTOINCREMENT列是rowid列的别名,并且与没有 AUTOINCREMENT的rowid的别名相比,它使用不同的、更昂贵的算法。

也就是说,如果没有AUTOINCREMENT ,为rowid列生成的值将在表中找到最大值并将其递增。除非该值超过 9223372036854775807,在这种情况下,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;

运行两次后,结果是:-

在此处输入图像描述


推荐阅读