codeigniter 中用 where_in() 批量删除多条记录,核心是将 id 数组传入 where_in() 后调用 delete(),生成安全高效的 in 子句;需校验非空、防注入、慎用于大数据量,并推荐软删除替代物理删除。

CodeIgniter 框架中用 where_in() 批量删除多条记录,核心是把 ID(或其他唯一字段)数组传给 where_in(),再调用 delete()。它生成标准 SQL 的 IN 子句,安全、简洁、高效。
基础写法:一行完成批量删除
控制器中直接使用即可:
$ids = [4, 5, 6, 12];<br>
$this->db->where_in('id', $ids);<br>
$this->db->delete('users');
等价于原生 SQL:DELETE FROM users WHERE id IN (4, 5, 6, 12);
✅ 自动参数绑定,防 SQL 注入
✅ 支持整数、字符串、UUID 等类型数组(需与字段类型一致)
❌ 不支持空数组 —— 若 $ids 可能为空,务必先判断:
if (!empty($ids)) { $this->db->where_in('id', $ids)->delete('users'); }- 否则会生成
WHERE id IN (),多数数据库报语法错误
结合表单复选框的完整流程
前端提交复选框数据(如 <input type="checkbox" name="ids[]" value="7">),后端需做三件事:
- 用
$this->input->post('ids')获取数组,它已是索引数组,无需explode() - 过滤并校验每个 ID 是正整数:
array_map('intval', $ids)或逐个ctype_digit()判断 - 删除前建议加事务包裹,确保失败可回滚:
$this->db->trans_start(); ... $this->db->trans_complete();
注意事项与避坑点
⚠️ 字段名大小写敏感:MySQL 默认不区分,但某些配置或严格模式下,'ID' 和 'id' 视为不同字段,建议统一小写
⚠️ 不能混用 where() 和 where_in() 后再 delete():若已调用 $this->db->where('status', 'pending'),再链式调用 where_in('id', $arr),最终条件是 AND 关系,符合预期;但要确认逻辑是否真需要双重限制
⚠️ 大数据量时慎用:一次性传入上万 ID 可能触发 MySQL 的 max_allowed_packet 限制或拖慢查询。超 5000 条建议分批处理,例如每 1000 条执行一次 delete
替代方案:软删除更推荐
生产环境不建议物理删除,改用软删除更安全:
- 表中加字段
deleted_at DATETIME NULL - 删除时更新:
$this->db->set('deleted_at', 'NOW()', FALSE)->where_in('id', $ids)->update('users'); - 后续查询自动排除:
$this->db->where('deleted_at IS NULL')->get('users');
这样既能保留历史痕迹,又支持误操作恢复,还避免外键级联风险。











