为什么MySQL安全更新模式不允许LIKE谓词?

时间:2019-05-29 18:39:56

标签: mysql

请考虑以下情况:

  • 我有一个名为actor的MySQL表。 (是的,来自Sakila示例数据库)。
  • 表中有一个名为last_name的varchar列。
  • 该列上有一个(非主)键。
  • MySQL安全更新模式已打开。

当我运行此查询时,它会起作用:

DELETE FROM actor WHERE last_name = 'foo';

当我运行此查询时:

DELETE FROM actor WHERE last_name LIKE '%fo' OR last_name LIKE 'fo%';

它失败并显示以下错误消息:

  

错误代码:1175。您正在使用安全更新模式,并且试图在没有使用KEY列的WHERE的情况下更新表。要禁用安全模式,请在“首选项”->“ SQL编辑器”中切换选项,然后重新连接。

为什么安全更新模式会停止第二个命令并允许第一个命令?

1 个答案:

答案 0 :(得分:1)

根据documentation

  

即使优化程序决定不使用键列上的索引,即使使用WHERE子句中指定的键,UPDATE和DELETE语句也可能在安全更新模式下产生错误。

LIKE 'fo%'这样的测试通常会使用索引(索引可用于匹配列的开头),因此不会引起错误。但是无法为像LIKE '%fo'这样的测试建立索引(它没有指定列的开头,因此必须进行全面扫描),因此会出现错误。