CodeIgniter中按指定数量删除行:当前写法是否最优?
这种删除写法绝非最优实现
问题所在
你现在的代码是循环$inputs['inputExamCount']次,每次只删1条符合status='Free'的数据,这种做法有两大硬伤:
- 会触发和参数值一样多的数据库请求,频繁的数据库交互会拖慢执行速度,要是参数值很大(比如几百上千),性能下降会特别明显。
- 循环过程中如果遇到并发修改、数据库连接异常等情况,实际删除的行数可能和预期对不上,可靠性差。
另外要注意:你原代码里的条件数组写错了,array('status','Free')不是正确的条件写法,应该写成array('status' => 'Free'),不然原代码根本删不到符合条件的数据。
最优写法
直接在单次删除操作里同时指定条件和删除条数,只需要一次数据库请求就能完成,效率和可靠性都拉满。
对应你用的CodeIgniter框架,正确代码应该是:
/*$inputs['inputExamCount'] 为45*/ $this->db->delete('agency_person_exams', array('status' => 'Free'))->limit($inputs['inputExamCount']);
如果用原生SQL,就是:
DELETE FROM agency_person_exams WHERE status = 'Free' LIMIT 45;
额外提醒
- 要确保
$inputs['inputExamCount']是正整数,别传负数或者非数值,不然会触发SQL错误。 - 不同数据库的批量删除语法略有差异,比如PostgreSQL要用
DELETE ... WHERE ... FETCH FIRST 45 ROWS ONLY,但核心思路都是一次操作搞定,别循环删。
内容的提问来源于stack exchange,提问作者Mohammadreza Esmaeeli
相关产品推荐
相关产品推荐

