sql - 如果我在列上使用 SQLite 自动递增,它会自动维护该列的索引吗?

标签 sql database sqlite rdbms

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

最佳答案

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

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

但它不仅是 your_column INTEGER PRIMARY KEY (AUTOINCREMENT 只能用在这样的列上,每个表只能有 1 个这样的列) 使该列成为隐藏的 rowid 列的别名。

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

所以 AUTOINCREMENT 列是 rowid 列的别名,并且使用与 别名不同的、更昂贵 的算法>rowid 没有 AUTOINCREMENT。

如果没有 AUTOINCREMENT,为 rowid 列生成的值将找到表中的最大值并将其递增。除非该值超过 9223372036854775807,在这种情况下,SQlite 将尝试找到一个未使用的较低值(通常在 1 和 9223372036854775807 之间)。

使用 AUTOINCREMENT 算法会取最大值和存储在表 sqlite_sequence 中的相应表的值中的较高值并使用它(因此任何删除的较高值将不得重复使用)。但是,如果使用了 9223372036854775807,则会引发 SQLITE_FULL 错误。

应注意以下事项:-

The AUTOINCREMENT keyword imposes extra CPU, memory, disk space, and disk I/O overhead and should be avoided if not strictly needed. It is usually not needed.

SQLite Autoincrement您可能很想阅读此内容。

补充

重新评分评论:-

If I don't use AUTOINCREMENT I have to explicitly create unique integer IDs and then insert them in database each time a new row is inserted.

以下证明不需要 AUTOINCREMENT:-

CREATE TABLE IF NOT EXISTS xyz (ID INTEGER PRIMARY KEY);
INSERT INTO xyz VALUES(null);
SELECT * FROM xyz;

运行两次后结果是:-

enter image description here

关于sql - 如果我在列上使用 SQLite 自动递增,它会自动维护该列的索引吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54301643/

相关文章:

php - PDO无参数绑定(bind)sql错误

database - 将 postgres 表导出到 csv 错误

SQLite - 选择相同数据/列的多个条目

c# - DateTime.Now 是 future 使用的可靠方法吗?

mysql - 使用递增的文本值更新表中的所有行

mysql - 选择列中最大值的行 - MySQL

sql - SELECT之前要ORDER BY?

ios - 无法打开 iOS 应用程序中使用的 sql 存储文件

mysql - 将所有字段分组在一行中

java - 为什么我的 Android ORM 库会生成这些奇怪的字符串?