文章目录
- 相关知识
- 创建表
- 插入数据
- 查看自增列
- 重置自增列
- 注意事项
- 参考文档
相关知识
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。
创建表
设置主键自增
CREATE TABLE [test]([ID] INTEGER PRIMARY KEY AUTOINCREMENT, [Name] TEXT(50), [Amount] REAL
);
错误的方式
CREATE TABLE [test]([ID] INTEGER AUTOINCREMENT, [Name] TEXT(50), [Amount] REAL
);
-- > near "AUTOINCREMENT": syntax errorCREATE TABLE [test]([ID] int PRIMARY KEY AUTOINCREMENT, [Name] TEXT(50), [Amount] REAL
);
-- > AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY
插入数据
主键位置写成NULL
insert into test values(NULL, '商品A', 10);
或不插入主键
insert into test(Name, Amount) values('商品B', 20);
自增列也可以手动插入数据,后续的自增列的值会按照最大值进行递增(这样可能会导致数据不连续,但肯定是递增的)。
insert into test(id,Name, Amount) values(100,'商品B', 20);insert into test values(NULL, '商品A', 10);
查看数据
SELECT * from test;
-- ID Name Amount
-- 1 商品A 10
-- 2 商品B 20
-- 100 商品B 20
-- 101 商品A 10
查看自增列
查询自增列当前值
select * from sqlite_sequence WHERE name = 'test';
-- name seq
-- test 101
重置自增列
查询自增列内部表
select * from sqlite_sequence;
重置为空
delete from sqlite_sequence where name = 'test' ;
或设为指定值
update sqlite_sequence set seq = 100 where name = 'test';
模拟极端情况:
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
注意事项
- 只有INTEGER类型支持自增,而int不支持,虽然INTEGER和int在大部分情况下是一样的。
- INTEGER 是一个64位有符号整数,2^64次方就是 9223372036854775807,即 9223372 亿,922万亿,一般数据表应该也没有这么大!(超过会报错)
INTEGER PRIMARY KEY AUTOINCREMENT
都是连在一起用的,不能是INTEGER AUTOINCREMENT
,也就是一个表只能有一个自增键。- 自增值可以从sqlite_sequence表中查出来,但是一开始的时候这个表是不存在的,只有在创建带有自增列的表之后才会创建这个表,有自增列的表插入数据之后,sqlite_sequence才会有记录。
参考文档
https://www.cnblogs.com/txgh/p/17764205.html
SQLite Autoincrement
sqlite_sequence