在SQLite的实际使用中,单条执行INSERT语句插入数据的方式效率很低,尤其是需要插入上百上千条数据时,频繁的磁盘IO和事务开销会明显拖慢程序运行速度。掌握批量插入数据的方法,能够有效提升数据写入效率,适配更多业务场景。

方法一:使用多值INSERT语法批量插入
SQLite支持在一条INSERT语句中写入多个值组,实现单次语句插入多条数据,这是最基础的批量插入方式,适合数据量较小、数据已经确定的场景。
语法格式如下:
INSERT INTO 表名 (列1, 列2, 列3) VALUES (值1_1, 值1_2, 值1_3), (值2_1, 值2_2, 值2_3), (值3_1, 值3_2, 值3_3);
下面是具体的示例,先创建一张用户表,再一次性插入三条用户数据:
-- 创建用户表
CREATE TABLE IF NOT EXISTS user (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER,
email TEXT
);
-- 批量插入三条用户数据
INSERT INTO user (name, age, email)
VALUES
('张三', 25, 'zhangsan@ipipp.com'),
('李四', 28, 'lisi@ipipp.com'),
('王五', 22, 'wangwu@ipipp.com');这种方式的优点是语法简单,不需要额外处理事务,缺点是一条语句能插入的数据量有限,如果数据量过大,SQL语句会变得很长,甚至超出SQLite的语句长度限制。
方法二:结合事务优化批量插入
SQLite默认每条INSERT语句都会开启一个独立事务,单条插入时事务开销占比很高。如果先把多条插入操作放在同一个事务中执行,就能大幅减少事务提交的次数,提升插入效率。
使用事务批量插入的步骤如下:
- 开启事务:执行BEGIN TRANSACTION语句
- 执行多条INSERT语句插入数据
- 提交事务:执行COMMIT语句,如果执行过程中出现错误则执行ROLLBACK回滚事务
下面是Python语言中使用事务批量插入数据的示例:
import sqlite3
# 连接SQLite数据库,如果数据库不存在会自动创建
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
# 创建测试表
cursor.execute('''
CREATE TABLE IF NOT EXISTS product (
id INTEGER PRIMARY KEY AUTOINCREMENT,
product_name TEXT NOT NULL,
price REAL,
stock INTEGER
)
''')
# 准备要插入的多条数据
product_data = [
('笔记本电脑', 4999.00, 100),
('无线鼠标', 89.00, 500),
('机械键盘', 299.00, 200),
('显示器', 1299.00, 150),
('移动硬盘', 399.00, 300)
]
try:
# 开启事务
cursor.execute('BEGIN TRANSACTION')
# 循环执行插入语句
for item in product_data:
cursor.execute('INSERT INTO product (product_name, price, stock) VALUES (?, ?, ?)', item)
# 提交事务
conn.commit()
print('批量插入数据成功')
except Exception as e:
# 出错时回滚事务
conn.rollback()
print(f'插入数据失败,错误信息:{e}')
finally:
# 关闭连接
conn.close()方法三:使用executemany方法批量插入
很多编程语言的SQLite驱动都提供了executemany方法,专门用来批量执行参数化的SQL语句,内部会自动优化执行逻辑,比手动循环执行单条插入效率更高,也更简洁。
下面是Python中使用executemany批量插入数据的示例:
import sqlite3
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
# 创建测试表
cursor.execute('''
CREATE TABLE IF NOT EXISTS student (
id INTEGER PRIMARY KEY AUTOINCREMENT,
student_name TEXT NOT NULL,
score REAL,
class TEXT
)
''')
# 准备批量插入的数据列表
student_data = [
('赵六', 92.5, '三年级一班'),
('孙七', 88.0, '三年级一班'),
('周八', 95.5, '三年级二班'),
('吴九', 76.0, '三年级二班'),
('郑十', 89.5, '三年级三班')
]
# 使用executemany批量插入
sql = 'INSERT INTO student (student_name, score, class) VALUES (?, ?, ?)'
cursor.executemany(sql, student_data)
# 提交事务
conn.commit()
print('使用executemany批量插入数据成功')
conn.close()不同批量插入方法的对比
为了帮助开发者选择合适的方法,下面从适用场景、效率、数据量限制三个维度对三种方法进行对比:
| 插入方法 | 适用场景 | 效率 | 数据量限制 |
|---|---|---|---|
| 多值INSERT语法 | 数据量小、数据固定的场景 | 中等 | 受SQL语句长度限制,一般建议不超过几百条 |
| 事务+循环插入 | 数据量中等、需要自定义插入逻辑的场景 | 较高 | 无明确限制,适合上万条数据插入 |
| executemany方法 | 数据量大、使用编程语言操作的场景 | 最高 | 无明确限制,底层做了优化,适合大量数据批量写入 |
注意事项
- 批量插入数据时如果不需要实时查询插入的结果,可以在插入完成后再创建索引,避免插入过程中频繁更新索引影响效率
- 如果插入的数据量特别大,建议分批次插入,每插入一批提交一次事务,避免单次事务占用过多内存
- 参数化插入时尽量使用占位符而不是字符串拼接,既能避免SQL注入风险,也能让数据库更好地复用执行计划
SQLite批量插入INSERT语句事务executemany修改时间:2026-05-30 21:20:32