codeigniter批量插入应使用insert_batch()方法并配合事务控制、数据清洗与分批处理。需传入二维关联数组,注意xss过滤、类型转换、索引优化及超大数据分批(如500–1000条/批),失败时通过trans_status()判断并回滚。

CodeIgniter 批量插入数据库,关键不是堆代码,而是用对方法、避开常见坑。核心是善用框架自带的 insert_batch() 方法,并配合合理的数据预处理和事务控制。
用 insert_batch() 是最直接高效的方式
CodeIgniter 的 insert_batch() 会把多条 INSERT 合并成一条 SQL(如 INSERT INTO table (a,b) VALUES (1,2),(3,4),(5,6)),大幅减少数据库交互次数,性能比循环调用 insert() 高数倍。
- 数据必须是二维数组,每项为关联数组,键名对应字段名:
[ ['name'=>'张三','age'=>25], ['name'=>'李四','age'=>30] ] - 表名和数据数组传入即可:
$this->db->insert_batch('users', $data); - 成功返回插入行数,失败返回
FALSE,记得检查返回值
大批量数据时务必加事务包裹
插入几千条以上数据时,单条失败会导致部分写入,数据不一致。用事务保证原子性:
- 开头调用
$this->db->trans_start(); - 执行
insert_batch() - 结尾调用
$this->db->trans_complete(); - 之后用
$this->db->trans_status()判断是否成功,失败可统一处理或回滚
注意字段过滤与数据清洗不能省
insert_batch() 不自动过滤 XSS 或转义特殊字符,尤其当数据来自用户输入时:
- 启用全局 XSS 过滤(
$config['global_xss_filtering'] = TRUE;)仅对 GET/POST/COOKIE 生效,对手动构造的数组无效 - 推荐在组装数据前,用
$this->security->xss_clean()或html_escape()处理敏感字段(如 name、content) - 数值类字段建议强制类型转换:
'age' => (int)$raw['age'],避免字符串注入风险
超大数据量(如 >10 万条)考虑分批处理
单次 insert_batch() 数据过多可能触发 MySQL 的 max_allowed_packet 限制,或导致内存溢出:
- 按每 500–1000 条为一组切分原始数组
- 循环调用
insert_batch(),每次都在事务内完成 - 插入后可用
gc_collect_cycles()主动回收内存(尤其 CLI 环境)
不复杂但容易忽略:批量插入前确认目标表有合适索引,避免因唯一键冲突导致整批失败;插入后如需获取自增 ID,CodeIgniter 的 insert_batch() 不返回 ID 列表,得换用其他方式(如分批 + insert_id())。











