请考虑以下情况:
actor
的MySQL表。 (是的,来自Sakila示例数据库)。last_name
的varchar列。 当我运行此查询时,它会起作用:
DELETE FROM actor WHERE last_name = 'foo';
当我运行此查询时:
DELETE FROM actor WHERE last_name LIKE '%fo' OR last_name LIKE 'fo%';
它失败并显示以下错误消息:
错误代码:1175。您正在使用安全更新模式,并且试图在没有使用KEY列的WHERE的情况下更新表。要禁用安全模式,请在“首选项”->“ SQL编辑器”中切换选项,然后重新连接。
为什么安全更新模式会停止第二个命令并允许第一个命令?
答案 0 :(得分:1)
即使优化程序决定不使用键列上的索引,即使使用WHERE子句中指定的键,UPDATE和DELETE语句也可能在安全更新模式下产生错误。
像LIKE 'fo%'
这样的测试通常会使用索引(索引可用于匹配列的开头),因此不会引起错误。但是无法为像LIKE '%fo'
这样的测试建立索引(它没有指定列的开头,因此必须进行全面扫描),因此会出现错误。