使用LIKE条件的DELETE查询单次执行无法删除全部匹配行
该DELETE语句单次执行无法删除全部匹配行的常见原因如下:
- 触发器逻辑影响
若product表上配置了DELETE相关触发器,是该问题的最高发原因:如果是BEFORE DELETE触发器,可能存在过滤逻辑跳过了部分匹配行的删除操作;如果是AFTER DELETE触发器,可能在删除部分行后,又向product表插入了新的符合brand LIKE 'Brand%'规则的行,导致第一次执行后仍有剩余匹配项。 - 并发与锁冲突
执行删除操作时如果有其他未提交的事务,持有部分匹配行的行锁,第一次删除时无法获取这部分行的锁,只能删掉未被锁定的匹配行。等第二次执行时其他事务已经提交释放锁,才能删掉剩余的行。
另外如果数据库使用MVCC快照读(比如InnoDB引擎默认的可重复读隔离级别),第一次执行删除时部分匹配行还处于未提交状态,在当前快照中不可见,第二次执行时对应行已经提交,就能被匹配到并删除。 - 数据库内置安全限制
很多数据库或者客户端工具默认开启了安全操作限制,单次DML操作影响行数超过阈值时会自动截断,仅执行部分操作。比如部分MySQL客户端默认配置单次删除最多影响行数为30,50条匹配项刚好需要执行两次才能删完,符合你遇到的场景特征。 - 匹配规则与操作对象特性问题
部分匹配行的brand字段可能包含不可见特殊字符、存在大小写匹配歧义,第一次执行时因为字符集、排序规则的问题未被匹配到,第二次执行时环境变更后才被正常匹配。
如果DELETE语句操作的product不是基表而是关联了多个基表的可更新视图,单次删除操作默认只能作用于单个基表的匹配行,也需要多次执行才能删掉所有基表中符合条件的行。
内容的提问来源于stack exchange,提问作者Colbs
相关产品推荐
相关产品推荐

