SQLite自增列相关内容

文章目录


相关知识

SQLite的自增用法和MySQL类似:使用的关键字是AUTOINCREMENT(MySQL用的是AUTO_INCREMENT)。

AUTOINCREMENT关键字会增加额外的CPU、内存、磁盘空间和磁盘I/O开销,如果不是严格需要的话,应该避免使用。它通常是不需要的。

在SQLite中,具有INTEGER PRIMARY KEY类型的列是ROWID的别名(除了在没有ROWID的表中),它总是一个64位有符号整数。

在INSERT操作中,如果ROWID或INTEGER PRIMARY KEY列没有显式地给定一个值,那么它将被一个未使用的整数自动填充,通常比当前使用的最大ROWID多一个。无论是否使用AUTOINCREMENT关键字,都是如此。

如果AUTOINCREMENT关键字出现在INTEGER PRIMARY KEY之后,则会更改自动ROWID分配算法,以防止在数据库生命周期内重用ROWID。换句话说,AUTOINCREMENT的目的是防止从先前删除的行中重用rowid。

创建表

设置主键自增

sql 复制代码
CREATE TABLE [test](
  [ID] INTEGER PRIMARY KEY AUTOINCREMENT, 
  [Name] TEXT(50), 
  [Amount] REAL
);

错误的方式

sql 复制代码
CREATE TABLE [test](
  [ID] INTEGER AUTOINCREMENT, 
  [Name] TEXT(50), 
  [Amount] REAL
);
-- > near "AUTOINCREMENT": syntax error

CREATE TABLE [test](
  [ID] int PRIMARY KEY AUTOINCREMENT, 
  [Name] TEXT(50), 
  [Amount] REAL
);
-- > AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY

插入数据

主键位置写成NULL

sql 复制代码
insert into test values(NULL, '商品A', 10);

或不插入主键

sql 复制代码
insert into test(Name, Amount) values('商品B', 20);

自增列也可以手动插入数据,后续的自增列的值会按照最大值进行递增(这样可能会导致数据不连续,但肯定是递增的)。

sql 复制代码
insert into test(id,Name, Amount) values(100,'商品B', 20);

insert into test values(NULL, '商品A', 10);

查看数据

sql 复制代码
SELECT * from test;
-- ID	Name	Amount
-- 1	商品A	10
-- 2	商品B	20
-- 100	商品B	20
-- 101	商品A	10

查看自增列

查询自增列当前值

sql 复制代码
select * from sqlite_sequence WHERE name = 'test';
-- name	seq
-- test	101

重置自增列

查询自增列内部表

sql 复制代码
select * from sqlite_sequence;

重置为空

sql 复制代码
delete from sqlite_sequence where name = 'test' ;

或设为指定值

sql 复制代码
update sqlite_sequence set seq = 100 where name = 'test';

模拟极端情况:

sql 复制代码
UPDATE sqlite_sequence set seq = '9223372036854775806' WHERE name = 'test';
-- > Affected rows: 1

-- 这条插入后达到最大值 9223372036854775807
insert into test(name) VALUES ('测试') ;

-- 设置临界值后再插入,会报错
insert into test(name) VALUES ('测试') ;
-- > database or disk is full

注意事项

  1. 只有INTEGER类型支持自增,而int不支持,虽然INTEGER和int在大部分情况下是一样的。
  2. INTEGER 是一个64位有符号整数,2^64次方就是 9223372036854775807,即 9223372 亿,922万亿,一般数据表应该也没有这么大!(超过会报错)
  3. INTEGER PRIMARY KEY AUTOINCREMENT 都是连在一起用的,不能是INTEGER AUTOINCREMENT,也就是一个表只能有一个自增键。
  4. 自增值可以从sqlite_sequence表中查出来,但是一开始的时候这个表是不存在的,只有在创建带有自增列的表之后才会创建这个表,有自增列的表插入数据之后,sqlite_sequence才会有记录。

参考文档

https://www.cnblogs.com/txgh/p/17764205.html

SQLite Autoincrement

sqlite_sequence

相关推荐
l***749419 小时前
Spring Boot 中使用 @Transactional 注解配置事务管理
数据库·spring boot·sql
nvd1119 小时前
Pytest 中使用 SQLAlchemy 进行异步数据库测试
数据库·oracle·pytest
2501_9411113421 小时前
Python上下文管理器(with语句)的原理与实践
jvm·数据库·python
程序员卷卷狗1 天前
MySQL 高可用方案:主从 + MHA + ProxySQL + PXC 的实战应用与架构思考
数据库·mysql·架构
千千寰宇1 天前
[数据库/数据结构] LSM-Tree :结构化的日志合并树——NewSQL数据库的基石
数据库
韩立学长1 天前
基于Springboot的研学旅游服务系统5u416w14(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·旅游
isNotNullX1 天前
怎么理解ETL增量抽取?
数据库·数据仓库·etl·企业数字化
谅望者1 天前
数据分析笔记14:Python文件操作
大数据·数据库·笔记·python·数据挖掘·数据分析
l1t1 天前
调用python函数的不同方法效率对比测试
开发语言·数据库·python·sql·duckdb
honortech1 天前
MySQL 8 连接报错:Public Key Retrieval is not allowed
数据库·mysql