如何使用带参数的IN语句兼容MySQL、SQLite实现批量删除记录
解决方案
方案1:应用层动态生成占位符(优先推荐)
该方案兼容所有支持预编译逻辑的数据库,完全规避SQL注入风险,原生适配MySQL和SQLite:
- 先将逗号分隔的参数字符串按
,拆分为独立的ID数组,例如将"1,2,3,4"拆分为[1,2,3,4] - 根据数组长度动态生成对应数量的占位符,数组长度为n就生成n个
?用逗号分隔,最终生成的SQL模板为DELETE FROMtblregs2WHERERegdIDIN (?, ?, ?, ?) - 将拆分后的数组元素作为独立参数依次绑定到占位符上执行即可
方案2:单参数适配(依赖JSON函数支持)
如果业务场景限制必须传入单个逗号分隔字符串参数,且使用的MySQL >= 8.0、SQLite >= 3.38.0 版本,可使用二者都兼容的JSON拆分函数实现:
DELETE FROM `tblregs2` WHERE `RegdID` IN ( SELECT value FROM json_each(CONCAT('[', @RegdID, ']')) )
原理是先把传入的逗号分隔字符串拼接为合法JSON数组格式,再通过json_each函数把数组拆分为多行单值结果集,直接供给IN语句匹配。
注意事项
- 禁止直接将用户输入的参数字符串拼接进SQL语句,会存在极高SQL注入风险
- 优先选择方案1,兼容性和安全性都更高
内容的提问来源于stack exchange,提问作者Hamada
相关产品推荐
相关产品推荐

