gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 23:27:42 24 4
gpt4 key购买 nike

我在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com