【问题标题】:MySQL safe mode error even when using the primary key in a where clause即使在 where 子句中使用主键,MySQL 安全模式也会出错
【发布时间】:2019-12-10 16:39:17
【问题描述】:

之前很多次,当我尝试在 mySQL 表中设置/更新/删除某些内容时,它给出了

错误代码:1175。您正在使用安全更新模式,并且您尝试更新没有使用 KEY 列的 WHERE 的表 要禁用安全模式,请切换 Preferences -> SQL Editor 中的选项并重新连接。

我可以通过在 where 子句中包含一个涉及主键的真实条件来解决这个问题。

但是,为什么以下方法不起作用?

UPDATE Lifts 
INNER JOIN liftstemp on Lifts.LiftID = liftstemp.LiftID
SET Lifts.AnnualNoLoadTestDate = liftstemp.AnnualNoLoadTestDate
where Lifts.LiftID<>"";

LiftID 是一个 varchar 并且是主键。

更新:根据 Bill Karwin 的建议,我暂时禁用了安全模式并收到了一份 EXPLAIN 报告,但我不知道如何解释它。

最终更新:结果可能是版本问题。我在那台机器上运行 mariadb。在另一台装有 mySQL 的机器上,它没有任何问题。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    https://dev.mysql.com/doc/refman/8.0/en/mysql-tips.html#safe-updates 说:

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

    获取查询的 EXPLAIN 报告,我预计您会看到它在一个或另一个表上执行 type: ALL


    我创建了一个与您类似的表,并在其中填充了 2000 行。我设置了sql_safe_updates=1,并尝试了您的更新。

    没有错误或警告。

    我在 MySQL 5.7.27 上测试过。

    另外,当我对您显示的查询运行 EXPLAIN 时,您显示的 EXPLAIN 不是我得到的。我开始猜测您没有显示导致错误的查询。

    【讨论】:

    • 谢谢,但只是在查询开头加上“解释”并没有帮助,因为它仍然只是给出同样的错误。
    • 您可能必须暂时禁用安全更新才能运行 EXPLAIN。
    • 谢谢,收到 EXPLAIN 报告,但不知道如何解释?
    • 查询,从 MySQL 工作台复制粘贴。但我想知道它是否与 MySQL 版本有关。将进行更多测试和更新。
    猜你喜欢
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多