SQLite作为轻量级嵌入式数据库,在很多移动应用和小型项目中被广泛使用,自增ID是数据库表设计中常用的主键方案,能自动生成唯一标识记录的数值。SQLite的自增主键实现和其他数据库有明显区别,需要遵循特定的设置规则,插入数据时也有对应的处理方式。

SQLite自增ID的设置方式
SQLite中设置自增主键不需要像MySQL那样使用AUTO_INCREMENT关键字,而是通过INTEGER PRIMARY KEY的组合来实现,如果需要严格保证自增ID的自增特性,还可以添加AUTOINCREMENT关键字。
基础自增主键设置
最基础的自增主键设置方式是在建表时,将主键字段定义为INTEGER PRIMARY KEY,SQLite会自动将该字段作为自增字段处理,默认从1开始自增。
-- 创建带自增主键的用户表
CREATE TABLE user (
id INTEGER PRIMARY KEY,
username TEXT NOT NULL,
age INTEGER
);
带AUTOINCREMENT的自增主键设置
如果需要严格保证自增ID不会重复使用之前删除过的ID值,可以在主键定义后添加AUTOINCREMENT关键字,这种设置下,自增ID会一直递增,即使删除了最大的ID记录,新插入的记录也不会使用被删除的ID值。
-- 创建带严格自增主键的用户表
CREATE TABLE user_strict (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL,
age INTEGER
);
SQLite自增主键的插入方法
设置好自增主键后,插入数据时不需要手动指定自增字段的值,SQLite会自动为其生成对应的自增数值,以下是几种常见的插入场景。
插入时不指定自增字段
这是最常用的插入方式,插入语句中只写非自增字段,自增ID会由数据库自动生成。
-- 向user表插入数据,不指定id字段
INSERT INTO user (username, age) VALUES ('张三', 25);
INSERT INTO user (username, age) VALUES ('李四', 28);
执行上述插入语句后,查询user表可以看到id字段会自动从1开始递增赋值。
插入时指定自增字段为NULL
如果插入语句中包含了自增字段,可以将其值设为NULL,SQLite同样会自动生成自增ID。
-- 插入时指定id为NULL,数据库自动生成自增值 INSERT INTO user (id, username, age) VALUES (NULL, '王五', 30);
插入时指定具体自增字段值
如果手动指定了自增字段的具体数值,且该数值没有被占用,SQLite会直接使用该数值作为记录的ID,不会触发自增逻辑。
-- 手动指定id为100,只要100未被占用就会插入成功 INSERT INTO user (id, username, age) VALUES (100, '赵六', 35);
自增ID相关注意事项
- 使用
INTEGER PRIMARY KEY但不添加AUTOINCREMENT时,如果删除了最大的ID记录,新插入的记录的ID会重用被删除的最大ID值,不会继续递增。 AUTOINCREMENT关键字会增加额外的存储开销,因为SQLite需要维护一个自增计数器表sqlite_sequence,如果不需要严格保证ID不重用,不建议添加该关键字。- 如果要获取刚插入的自增ID值,可以使用
last_insert_rowid()函数,该函数会返回当前连接最后插入的记录的自增ID。
-- 插入数据后获取自增ID
INSERT INTO user (username, age) VALUES ('孙七', 22);
SELECT last_insert_rowid() AS last_id;
两种自增设置的区别对比
为了更清晰区分两种自增设置方式的差异,以下是两者的对比表格:
| 设置方式 | ID是否重用被删除的最大值 | 是否需要维护额外计数器 | 适用场景 |
|---|---|---|---|
| INTEGER PRIMARY KEY | 是 | 否 | 对ID是否连续无严格要求,追求轻量性能 |
| INTEGER PRIMARY KEY AUTOINCREMENT | 否 | 是 | 严格要求ID唯一递增,不允许重用历史ID |