当前位置: 首页 > 知识库问答 >
问题:

即使在where子句中使用主键,MySQL安全模式也会出错

张财
2023-03-14

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

错误代码: 1175年。您正在使用安全更新模式,并且您尝试更新不使用使用 KEY 列的 WHERE 的表 要禁用安全模式,请切换首选项中的选项 -

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

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

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

LiftID是一个varchar,是主键。

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

最终更新:结果表明可能是版本问题。我在那台机器上运行mariadb。在另一台使用mySQL的机器上,它可以正常工作。

共有1个答案

曹智
2023-03-14

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

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

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

我创建了一个与您类似的表,并用2000行填充它。我设置了sql_safe_updates=1,并尝试了您的UPDATE。

没有错误或警告。

我在MySQL 5.7.27上进行了测试。

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

 类似资料:
  • 我是mySQL的新手,在学习连接的同时,我尝试使用左连接、右连接和完全外部连接来创建一个完全连接。然后我意识到我的一个原始表(表t2)有一个空行。 当尝试删除它时,我得到错误:错误代码:1175。您正在使用安全更新模式,并且试图更新一个没有使用键列禁用安全模式的WHERE的表,请在Preferences->SQL Editor中切换该选项并重新连接。 更新:当我使用MySQL命令行时,我没有看到空

  • 问题内容: 我试图弄清楚如何在MySQL中优化一个非常慢的查询(我没有设计这个): 比较一下: 说明语句对我没有帮助: 好的,它仍然认为它需要大约400万个条目才能计数,但是我可以计算文件中的行数比这还要快!我不明白为什么MySQL要花这么长时间。 这是表的定义: 版: 有什么明显的我想念的东西吗?(是的,我已经尝试过“ SELECT COUNT(change_event_id)”,但是没有性能差

  • 问题内容: 假设我有这张桌子 我想返回第一行,其中所有先前现金的总和大于某个值: 因此,例如,如果我要返回第一行,其中所有先前现金的总和都大于500,则应返回到第3行 如何使用mysql语句执行此操作? 使用 不起作用 问题答案: 您只能在HAVING子句中使用聚合进行比较: 该子句要求您定义GROUP BY子句。 要获得第一行,其中所有先前现金的总和都大于某个值,请使用: 由于聚合函数发生在子查

  • 问题内容: 我想搜索我的表,其中有一列名字和一列姓氏。我目前接受来自某个字段的搜索字词,并将其与两列进行比较,一次 这对于单个单词搜索词可以正常工作,但结果集包含名称为“ Larry”的所有人。但是,如果有人输入名字然后输入空格,然后输入姓氏,我希望搜索结果更窄。我已经尝试了以下方法,但没有成功。 有什么建议吗? 编辑: 我正在测试的名称是“拉里·史密斯”。数据库将“ Larry”存储在“ fir

  • 这是表的create表 我在这里做错了什么?为什么在where子句中使用主键时会出现这个错误?

  • 我搜索了互联网、文档和stackoverflow上的大量内容,但都没有结果。我使用MySQL Workbench尝试在特定列的末尾连接一些附加值 我的原始代码是: 但是,这引发了一个错误“错误代码:1093。您不能在From子句中指定目标表“翻译”以进行更新”。我在stackoverflow上搜索并将我的代码更改为: 现在会抛出“错误代码:1175。您正在使用安全更新模式,并且您尝试更新一个没有使