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

Posted

技术标签:

【中文标题】如何避免 MySQL Workbench 错误代码:此更新期间出现 1175 *无需*禁用“安全更新”【英文标题】:How to avoid MySQL Workbench error code: 1175 during this UPDATE *without* disabling "safe updates" 【发布时间】:2018-08-25 09:52:12 【问题描述】:

我有一个特定的 mysql UPDATE 语句,确实在其 WHERE 子句中指定了所需的主键,但在 MySQL Workbench 中运行时仍会产生错误 1175。

我完全了解MySQL error code: 1175 during UPDATE in MySQL Workbench。我的情况似乎与MySQL error code: 1175 during UPDATE (MySQL-Workbench vs. console) 相同。像那个提问者一样,我确实希望禁用 MySQL-Workbench 的“安全更新/删除”选项。这个问题没有得到解决。我想尝试得到一个实际的解决方案。

SQLUPDATE 语句:

-- update new columns' values from corresponding rows in `charges_arc` UPDATE `charges` INNER JOIN `charges_arc` ON `charges`.`ChargeID` = `charges_arc`.`ChargeID` SET `charges`.`ChargeClearDate` = `charges_arc`.`ChargeClearDate` WHERE `charges`.`ChargeID` = `charges_arc`.`ChargeID`;

ChargeID 确实是chargescharges_arc 表中的主键列。

这意味着该语句确实满足 MySQL Workbench 的https://dev.mysql.com/doc/workbench/en/workbench-faq.html#faq-workbench-delete-safe:

默认情况下,Workbench 配置为不执行 DELETE 或 UPDATE 在 KEY 列上不包含 WHERE 子句的查询。

是否有解决方案来重写此查询,使 Workbench 不会出现错误 1175,需要设置 SET SQL_SAFE_UPDATES=0/更改 Workbench 的首选项?

【问题讨论】:

有趣。也许问题在于更新中的联接扩大了可以删除的记录数量,即仅指定主键不再“安全”,因为理论上它仍然可以包含表的一大块。 @TimBiegeleisen 这又是一个有趣的理论。我正在考虑尝试重写它以不使用JOIN,而是改为子查询WHERE charges.ChargeID IN ( SELECT charges_arc.ChargeID FROM charges_arc WHERE charges_arc.ChargeID = charges.ChargeID ),但如果你的理论是正确的,它也可能在那里犯规。既然我已经输入了这个,我现在就试一试...... 哎呀,如果你使用子查询的思想,你不能在SET子句中访问charges_arc.ChargeClearDate... 【参考方案1】:

好吧,玩得更深了,到目前为止,我发现以下内容似乎让 Workbench 很高兴:

-- update new columns' values from corresponding rows in `charges_arc` UPDATE `charges` INNER JOIN `charges_arc` ON `charges`.`ChargeID` = `charges_arc`.`ChargeID` SET `charges`.`ChargeClearDate` = `charges_arc`.`ChargeClearDate` WHERE `charges`.`ChargeID` = `charges_arc`.`ChargeID` AND `charges`.`ChargeID` <> -9999

这只是将AND charges.ChargeID &lt;&gt; -9999 添加到条件中。它几乎没有缩小范围(!),而且非常丑陋(!)。我只能猜测 Workbench 想“看到某种针对 PK 的 literal 测试”,以便您表明您已经以某种方式考虑过 PK!它至少允许您在不禁用“安全更新”的情况下进行查询。

我将把它打开几天,看看是否有人能想到一些更整洁的东西。

就我自己而言,我在一个大型升级脚本文件中有很多这样的UPDATEs,这对我来说看起来很丑陋,以至于我最终可能会在整个文件中使用SET SQL_SAFE_UPDATES=0。 ..

编辑:最后我决定在这些我更喜欢SET SQL_SAFE_UPDATES=0UPDATE ... JOIN ...s 类型中添加上面额外的AND 子句之类的东西太难看了,至少为了清楚起见。

【讨论】:

【参考方案2】:

使用 MySQL 5.6 和 MySQLWorkbench 8,我在相同的情况下收到此错误。我能够通过限定 WHERE 子句中的字段名称来修复错误。

例如,这导致了 1175 错误:

UPDATE `tReports`
SET
`Title` = Title,
`Descr` = Descr
WHERE `ID` = ID;

这解决了它:

UPDATE `tReports`
SET
`Title` = Title,
`Descr` = Descr
WHERE `tReports`.`ID` = ID;

【讨论】:

以上是关于如何避免 MySQL Workbench 错误代码:此更新期间出现 1175 *无需*禁用“安全更新”的主要内容,如果未能解决你的问题,请参考以下文章

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

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

MySQL错误代码:在MySQL Workbench中创建表期间出现1064 [关闭]

如何在 Mysql Workbench GUI 中查看表格内容?

怎样安装Mysql Workbench

使用 MySQL Workbench 5.2 在表上执行更新命令时出错(错误代码:1175)