如何在 UPDATE 期间解决错误代码 1175 mySQL?

Posted

技术标签:

【中文标题】如何在 UPDATE 期间解决错误代码 1175 mySQL?【英文标题】:How can I solve the Error code 1175 mySQL during UPDATE? 【发布时间】:2021-11-23 12:56:37 【问题描述】:

我正在准备更新一列,但在更新过程中总是出现同样的错误,如果我不想禁用“安全更新模式”,我该如何解决? 这是我的查询

UPDATE test
SET unit_price= (SELECT unit_price*1.15
                   FROM (SELECT unit_price  from test )as l           
                  )where qtyinstock>0

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

【问题讨论】:

请包含您收到的完整、准确的错误消息,而不仅仅是错误号。我们不必搜索错误代码来找出它的含义,错误消息的内容通常提供对解决问题有用的信息。完整的错误消息就在您面前的屏幕上,因此您绝对没有理由不在您的问题中提供它。您要求我们提供免费帮助来解决您的问题,通过向我们提供您已有的信息,让我们尽可能轻松地解决您的问题符合您的最大利益。 此外,如果您花一些时间访问tour 并阅读help center 页面以了解该网站的运作方式,您的体验会更好。 错误信息告诉你如何修复它。使用使用 KEY 列的 WHERE。如果您为表和一些示例数据添加 CREATE TABLE DDL,将会有很大帮助。 我想也许你使用内连接更新。 update test t1 inner join ( select unit_price*1.15 as unit_price from test where qtyinstock>0 ) as t2 on t1.unit_price =t2.unit_price set t1.unit_price =t2.unit_price ; 查询未测试 这是一项防止初学者犯错误的功能(例如,意外更新所有行而不是特定行 - 由主键标识),参见例如here。您可能正在使用的 mysql Workbench 默认启用此模式。错误消息告诉您如何在 Workbench 设置中禁用“安全模式”:“要禁用安全模式,请切换 Preferences -> SQL Editor 中的选项并重新连接。”(如果您使用的是不同的编辑器,要么告诉我们,要么在那里寻找类似的选项)。 【参考方案1】:

几周以来,我一直在与这个确切的问题作斗争。在我的情况下,UPDATE 代码在某些日子有效,并且在其他代码上失败并出现错误 1175,即使我在查询 where 子句中专门调用了主表索引。它看起来很随意,非常令人沮丧和困惑。 有很多关于禁用安全更新模式的 cmets,但在我的情况下,这不是一个可接受的选项。恕我直言,数据完整性太重要了,不能禁用此功能,我们都是人类,都会犯错误。 因此,经过大量研究后,我意识到 MySQL 查询优化器正在选择要使用的索引,以及当它决定使用主索引以外的索引时,它会抛出此错误消息。一些阅读链接在底部。

对于我的实现,解决方案是在 Update 语句中简单地添加优化器提示:

Update salesFact FORCE INDEX(PRIMARY)
...

在我的情况下实际上就这么简单!就我而言,我不得不使用 Force Index 而不是 Use Index。性能似乎也没有受到负面影响。我希望这对其他人有所帮助,因为它已经花费了我几周的时间! ;)

了解安全更新模式:https://dev.mysql.com/doc/refman/5.7/en/mysql-tips.html 阅读优化器提示:https://dev.mysql.com/doc/refman/5.7/en/index-hints.html

【讨论】:

以上是关于如何在 UPDATE 期间解决错误代码 1175 mySQL?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免 MySQL Workbench 错误代码:此更新期间出现 1175 *无需*禁用“安全更新”

MySQL 错误代码:更新期间的 1175(MySQL-Workbench 与控制台)

MySQL 错误代码:在 MySQL Workbench 中更新期间出现 1175

尝试在存储过程中更新时出现 MySQL 错误代码 1175

MySQL中进行update/delete操作时,发生 Error Code: 1175

Error Code: 1175. You are using safe update