答案是使用INTEGER PRIMARY KEY即可实现自增,AUTOINCREMENT非必需但可确保ID永不复用;插入后可通过last_insert_rowid()函数或对应编程语言的lastrowid属性获取新生成的ID。

在SQLite中设置自增ID,最直接且推荐的方式是使用
INTEGER PRIMARY KEY
AUTOINCREMENT
ROWID
要创建一个带有自增主键的表,你需要在定义表结构时,将某个列声明为
INTEGER PRIMARY KEY AUTOINCREMENT
举个例子,假设我们要创建一个存储用户信息的表:
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE
);在这个
CREATE TABLE
id
INTEGER PRIMARY KEY AUTOINCREMENT
AUTOINCREMENT
id
id
id
当你向这个表插入数据时,通常你不需要为
id
INSERT INTO users (name, email) VALUES ('张三', 'zhangsan@example.com');
INSERT INTO users (name, email) VALUES ('李四', 'lisi@example.com');如果你尝试插入
NULL
0
id
-- 即使指定 NULL,SQLite也会自动生成下一个ID INSERT INTO users (id, name, email) VALUES (NULL, '王五', 'wangwu@example.com');
值得注意的是,SQLite的
INTEGER PRIMARY KEY
ROWID
AUTOINCREMENT
ROWID
这其实是个老生常谈的问题了,很多初学者都会纠结。说实话,在绝大多数我们日常开发的应用场景里,
AUTOINCREMENT
SQLite的每个表,如果你没有明确指定
WITHOUT ROWID
ROWID
INTEGER PRIMARY KEY
ROWID
INTEGER PRIMARY KEY
NULL
0
ROWID
那么
AUTOINCREMENT
INTEGER PRIMARY KEY
AUTOINCREMENT
ROWID
2^63 - 1
AUTOINCREMENT
ROWID
ROWID
所以,我的个人观点是,如果你只是需要一个简单的自增主键,并且不担心ID复用或者数据量不会大到突破天际,那么
INTEGER PRIMARY KEY
AUTOINCREMENT
答案是:能,而且在大多数情况下工作得很好。
就像我前面提到的,SQLite的
INTEGER PRIMARY KEY
INTEGER PRIMARY KEY
AUTOINCREMENT
ROWID
我们来个例子:
CREATE TABLE products (
product_id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
price REAL
);
INSERT INTO products (name, price) VALUES ('笔记本电脑', 7999.00);
INSERT INTO products (name, price) VALUES ('机械键盘', 599.00);
INSERT INTO products (name, price) VALUES ('无线鼠标', 299.00);当你执行这些插入操作后,
product_id
如果你删除其中一行:
DELETE FROM products WHERE product_id = 2; -- 删除 '机械键盘'
然后你再插入一行:
INSERT INTO products (name, price) VALUES ('显示器', 1999.00);此时,新插入的
显示器
product_id
AUTOINCREMENT
INTEGER PRIMARY KEY
AUTOINCREMENT
INTEGER PRIMARY KEY
对于大多数业务系统,ID是否复用其实并不重要,只要它是唯一的就行。所以,如果你对ID的单调递增没有强烈的需求,或者你的数据量不会大到
ROWID
INTEGER PRIMARY KEY
在很多应用场景中,我们插入一条数据后,往往需要立即获取它自动生成的ID,以便进行后续操作,比如关联其他表数据。SQLite提供了一个非常方便的函数来实现这一点:
last_insert_rowid()
这个函数会返回当前数据库连接中,上一个成功执行的
INSERT
ROWID
INTEGER PRIMARY KEY
AUTOINCREMENT
ROWID
下面是一些常见编程语言中如何使用
last_insert_rowid()
Python (使用 sqlite3
在Python中,
sqlite3
cursor
lastrowid
SELECT last_insert_rowid()
import sqlite3
conn = sqlite3.connect('mydatabase.db')
cursor = conn.cursor()
# 确保表已创建
cursor.execute('''
CREATE TABLE IF NOT EXISTS articles (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
content TEXT
)
''')
conn.commit()
# 插入数据
article_title = "SQLite自增ID实践"
article_content = "这篇文章详细介绍了SQLite的自增ID设置方法。"
cursor.execute("INSERT INTO articles (title, content) VALUES (?, ?)", (article_title, article_content))
# 获取刚刚插入的ID
new_article_id = cursor.lastrowid
print(f"新文章的ID是: {new_article_id}")
conn.commit()
conn.close()Node.js (使用 sqlite3
在Node.js中,
sqlite3
run
this.lastID
const sqlite3 = require('sqlite3').verbose();
const db = new sqlite3.Database('mydatabase.db');
db.serialize(() => {
db.run(`
CREATE TABLE IF NOT EXISTS logs (
log_id INTEGER PRIMARY KEY AUTOINCREMENT,
message TEXT NOT NULL,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
)
`);
const message = "用户登录成功";
db.run("INSERT INTO logs (message) VALUES (?)", [message], function(err) {
if (err) {
return console.error(err.message);
}
// this.lastID 就是刚刚插入的自增ID
console.log(`新日志的ID是: ${this.lastID}`);
});
});
db.close();通过SQL查询直接获取 (适用于任何支持SQLite的客户端或语言):
如果你是在一个通用的SQL客户端或者没有
lastrowid
SELECT
-- 假设你刚刚执行了一个INSERT语句
INSERT INTO tasks (description, status) VALUES ('完成报告', '进行中');
-- 紧接着执行这个查询
SELECT last_insert_rowid();这个查询会返回一个单行单列的结果,就是你想要的自增ID。记住,
last_insert_rowid()
以上就是SQLite插入自增ID怎么设置_SQLite自增主键插入方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号