thinkphp 的 insertall() 方法用于批量插入记录,tp5.x 支持但 tp6.x 已废弃,推荐改用 saveall() 或原生 sql;需传入字段名一致的二维数组,返回成功条数。

ThinkPHP 的 insertAll() 方法用于一次性插入多条记录,效率比循环调用 insert() 高得多,但要注意版本差异和使用细节。
确认 ThinkPHP 版本支持
该方法在 ThinkPHP 5.0+ 中可用(TP5.0/5.1/6.x 均支持),但 TP6.x 中已不推荐使用,官方建议改用 saveAll() 或原生 SQL 批量插入。如果你用的是 TP6,请优先看下文的替代方案。
ThinkPHP 5.x 中 insertAll() 基本用法
需传入二维数组,每个子数组代表一条记录:
- 字段名必须与数据表字段严格一致(大小写敏感)
- 数组键名即字段名,无需额外指定字段列表
- 返回值为插入成功的记录数(int)
示例:
$data = [
['name' => '张三', 'age' => 22, 'email' => 'zhangsan@example.com'],
['name' => '李四', 'age' => 25, 'email' => 'lisi@example.com'],
['name' => '王五', 'age' => 23, 'email' => 'wangwu@example.com']
];
$result = Db::name('user')->insertAll($data);
// $result === 3(成功插入3条)
ThinkPHP 6.x 推荐替代方式
TP6 中 insertAll() 已被标记为废弃,应使用以下任一方式:
- 用 saveAll()(模型方式):适用于有对应模型的场景,自动处理时间戳、自动完成等
- 用 query() 执行原生批量 INSERT:性能最高,适合大数据量
- 用 Db::insert() + 多值语法:手动拼接 VALUES,可控性强
saveAll 示例:
$users = [
['name' => '张三', 'age' => 22],
['name' => '李四', 'age' => 25]
];
$result = (new User())->saveAll($users);
注意事项和常见问题
使用时容易踩坑的地方:
- 数据中不能混用 null 和空字符串,否则可能触发非空校验失败
- TP5.x 不会自动过滤非法字段,务必确保数组键名都是合法字段
- 大批量插入(如上万条)建议分批,每次 500~1000 条,避免超时或内存溢出
- TP6 中若强行调用
insertAll(),会触发 E_USER_DEPRECATED 警告
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











