sql - 如果我在列上使用 SQLite 自动增量,它会自动维护该列的索引吗?
问题描述
我在 SQLite 的整数数据列上使用自动增量。由于它是自动递增的,因此数据已经按该列按升序排序。所以,我想知道 SQLite 是否会在自动增量列搜索数据时对该列执行二进制搜索。
解决方案
实际上是的,但不是真的。
也就是说,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;
运行两次后,结果是:-
推荐阅读
- c# - WebSocketSharp C# StreamReader?
- excel - VBA Excel经常出错有时不出错
- javascript - 无法使用 javascript 设置输入字段类型密码和自动完成
- dax - 使用 power bi 分配和合并
- mysql - MySql 用户无需授权自动获得全局权限
- typescript - 如何在打字稿中将两个参数传递给函数或不传递?
- vue.js - 根据路线名称更改路线视图
- mdbootstrap - mdbootstrap 选项卡错误无法读取未定义的属性“拆分”
- pentaho - Pentaho 数据集成工具的 JRE (Kettle - 版本 8.2)
- vue.js - b-form-tags 无法正确呈现删除按钮