CodeIgniter批量插入二维数组需使用$insert_batch()方法,要求每条记录为键名统一的关联数组,键名须与数据库字段严格对应;不一致会导致字段丢失或报错,应通过array_map统一键名、判空保护、分批处理(如每1000条)及字段清洗确保稳定。

CodeIgniter 批量插入二维数组,关键在于用 $this->db->insert_batch() 方法,配合数据格式校验和字段映射,避免手动循环拼 SQL。
确保二维数组结构合规
每条记录必须是关联数组,且所有子数组的键名完全一致,对应数据库字段名。不一致会导致部分字段丢失或报错。
- ✅ 正确示例:
[ ['name' => '张三', 'age' => 25], ['name' => '李四', 'age' => 30] ] - ❌ 错误示例:
[ ['name' => '张三', 'age' => 25], ['username' => '李四', 'age' => 30] ](键名不统一) - 若原始数据键名不匹配,先用
array_map()统一重键,例如:array_map(function($row) { return ['name' => $row['username'] ?? '', 'age' => $row['user_age'] ?? 0]; }, $data)
调用 insert_batch 并处理返回值
该方法自动转义、批量拼接 INSERT 语句,执行后返回影响行数(成功时为正整数,失败返回 false)。
- 基础写法:
$this->db->insert_batch('users', $data); - 建议加判断:
if ($this->db->insert_batch('users', $data) === false) { log_message('error', '批量入库失败:' . $this->db->error()['message']); return false; } - 注意:不支持主键自增 ID 返回,如需获取最后插入 ID,请改用事务 + 单条循环(非推荐场景)
优化:空数组与大数据量防护
防止空数组触发异常,或单次传入超万条导致内存溢出或超时。
- 判空保护:
if (empty($data)) { return true; } - 分批处理(如每 1000 条一批):
array_chunk($data, 1000)循环调用insert_batch - 必要时临时调高 PHP 内存限制:
ini_set('memory_limit', '256M');(上线前应评估并移除)
字段过滤与类型预处理(可选但实用)
对敏感字段或类型不一致字段做前置清洗,比如字符串 trim、数字强制 int、时间转 Y-m-d H:i:s。
- 通用清洗函数示例:
$cleaned = array_map(function($row) { return array_map('trim', $row); }, $data); - 指定字段处理:
foreach ($data as &$row) { $row['created_at'] = date('Y-m-d H:i:s'); $row['status'] = (int)$row['status']; } - 避免在
insert_batch前修改原数组引用,建议用array_map或新建数组
不复杂但容易忽略细节,把数组键对齐、空值拦截、分批控制这三点做扎实,就能稳定支撑日常批量导入需求。

















