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

相关推荐
GreatSQL6 分钟前
使用 gt-checksum 分析迁移对象
数据库
用户6279947182628 分钟前
南大通用GBase8s数据库的create distinct type语句详解
数据库
bing_15818 分钟前
Nacos 客户端 SDK 的核心功能是什么?是如何与服务端通信的?
服务器·数据库·nacos 通信
AnsenZhu25 分钟前
Redis Cluster 使用 CRC16 算法实现 Slot 槽位分片的核心细节
数据库·redis·缓存·crc16
银河麒麟操作系统1 小时前
【银河麒麟高级服务器操作系统】磁盘只读问题分析
java·linux·运维·服务器·jvm
Jtti1 小时前
Ubuntu服务器上如何监控Oracle数据库
服务器·数据库·ubuntu
爱的叹息1 小时前
Java虚拟机(JVM)家族发展史及版本对比
java·开发语言·jvm
用户6279947182621 小时前
南大通用GBase 8c备份恢复功能概述
数据库
Hejjon1 小时前
Mysql 中 select ... for update 加锁总结
java·数据库·mysql
等等5431 小时前
mysql——索引事务和JDBC编程
数据库·mysql