我试图更新列visited,使其值为1。我使用MySQLWorkbench,从Workbench内部在SQL编辑器中编写语句。我正在编写以下命令:
它给出了以下错误:
You are using safe update mode and you tried to update a table without
a WHERE that uses a KEY column To disable safe mode, toggle the option
....
我按照说明操作,取消选中Edit菜单中的safe update选项,然后选择Preferences,然后选择SQL Editor。同样的错误仍然出现,我无法更新此值。请告诉我怎么了?
- 您是否知道这将更新表中visited=0变为visited=1的所有行?这就是你想要的吗?
- @马克·拜尔斯:是的。
- 取消选中"安全更新"后,请执行以下步骤:查询-->重新连接到服务器。现在执行查询
- 在该更改生效之前,必须重新连接到MySQL服务器(重新启动MySQL连接)。
您的MySQL会话似乎设置了安全更新选项。这意味着您不能在WHERE子句中不指定键(例如primary key)来更新或删除记录。
尝试:
1
| SET SQL_SAFE_UPDATES = 0; |
或者您可以修改查询以遵循规则(在where clause中使用primary key)。
- 我提到我已经从GUI中禁用了安全更新选项,它的效果与我输入命令的id相同。不过,谢谢你的回答,但我已经回答了我的问题。检查我的答案,知道问题出在哪里。
- 更改了GUI中的选项后,需要重新连接到数据库,以便正确设置设置。
- @我们能用唯一的钥匙吗?
- 是的,你可以试试
- 完成后,一定要用SET SQL_SAFE_UPDATES = 1将其设置回原处,因为这是一个值得使用的安全功能。
- 我不同意斯托克…您可能希望在更好地使用SQL时继续使用它…但一旦你知道你在做什么…那东西完全没用。无论如何,你不应该在生产服务器上开发你的东西,所以即使你搞砸了,你唯一应该破坏的就是你的开发服务器。谁也不在乎。
- 我不同意@mathieuturcotte。防御性编程几乎总是值得的。
- @数学是唯一的选择。您不需要保持启用状态。说这是毫无价值的,这是你对主体的主观看法,很明显你的观点并不流行。
- 我不在乎你怎么看我的观点,我的男人…在过去的15年里,我一直在用SQL编码。这个安全更新对我来说只是背部的疼痛。不管你对这件事有什么看法,事实上我从来没有弄乱过实时数据。15年内不会有一次。我讨厌这个选择,它不会改变的。
- 我已经在MSSQL中编码14年了,从去年开始我就在MySQL中…我对这个选择一点也不满意。
- 我只是想说,我在过去6个月里搜索了20次这篇文章,因为我11年来一直选择"假",但现在我在一家公司工作,这家公司的开发和生产都设置为"真"。默认情况下,将其设置为0有很多原因,例如,当开发独立功能时,您可能希望直接导出到csv,然后将其标记为导出或类似的内容。其他时候,由于没有任何pk过滤器的全局更新,这很烦人。我认为它更像是一个noob保护,而不是一个真正有用的特性。
- 它工作!!!!
执行更新命令之前,请执行以下步骤:在MySQL工作台中
去Edit->Preferences。
点击"SQL Editor"页签,uncheck安全更新check box页。
Query->Reconnect to Server//注销后登录
现在执行SQL查询
另外,不需要重新启动mysql守护进程!
- 对于版本6.3,步骤2应该是"Sql Editor"而不是"Sql Queries",然后在底部有一个用于"Safe Updates"的复选框。
- 如果这是一次性的,我建议你重新打开它,因为如果你不小心的话,这很容易把你的数据弄得一团糟。
- 谢谢康罗伊。有一阵子我看不见那个盒子。我只需要把窗户放大。
- 也许他们移动了它,但在MySQLWorkbench 6.0中,它位于"SQL查询"下,而不是"SQL编辑器"下。
- 是的,这里也一样,必须向下滚动一点才能看到它。
1 2 3
| SET SQL_SAFE_UPDATES =0;
UPDATE tablename SET columnname =1;
SET SQL_SAFE_UPDATES =1; |
- 不幸的是,其他基于查询的解决方案不适合我。但这一个成功了!我很感激你添加了一条线来重新打开安全更新。
- 我真的很喜欢这个,因为它可能是最一般的,同时仍然保持安全。
只需要:启动一个新查询并运行:
1
| SET SQL_SAFE_UPDATES = 0; |
然后:运行您试图运行的查询,该查询以前不起作用。
- 欢迎使用So,请务必阅读教程和帮助页面,并避免发布像这样的答案,因为此页面下面的许多答案与几个月前发布的内容完全相同。
- 您也可以在运行查询后再次启用此选项。
- 这个答案补充了什么?两年多后,你刚刚发布了和哈比比利亚一样的东西。想要收获业力?
不需要将SQL安全更新设置为0,我真的不鼓励这样做。出于某种原因,安全更新默认为打开。如果你知道我的意思,你可以不带安全带和其他东西开车;)只需在WHERE子句中添加一个键值,该键值与所有项(如主键)相匹配,而不是写入:
1 2 3 4 5
| UPDATE customers SET countryCode = 'USA'
WHERE country = 'USA'; -- which gives the error, you just write:
UPDATE customers SET countryCode = 'USA'
WHERE (country = 'USA' AND customerNumber <> 0); -- Because customerNumber is a primary key you got no error 1175 any more. |
现在您可以放心,每个记录都会(总是)如您所期望的那样更新。
- 这是天才!
- 感谢回答:+1
- 不知道这是可能的,干杯!
- 哈哈,这是个好把戏。我用WHERE id > 0作为这条线的一个技巧。
- 它对我不起作用,它继续向我显示同样的信息。我通过取消激活安全更新模式解决了这个问题,方法是:-编辑->首选项->SQL编辑器,然后取消选中安全更新。
错误代码:1175。您使用的是安全更新模式,并且您试图更新一个不带WHERE的表,该表使用键列来禁用安全模式,切换preferences->sql editor中的选项并重新连接。
暂时关闭"安全更新模式"
1 2 3
| SET SQL_SAFE_UPDATES = 0;
UPDATE options SET title = 'kiemvieclam24h' WHERE url = 'http://kiemvieclam24h.net';
SET SQL_SAFE_UPDATES = 1; |
永远关闭"安全更新模式"
mysql工作台8.0:
1
| MySQL Workbench => [ Edit ] => [ Preferences ] -> [ SQL Editor ] -> Uncheck"Safe Updates" |
旧版本可以:
1
| MySQL Workbench => [Edit] => [Preferences] => [SQL Queries] |
偏好。。。
"安全更新"…
重新启动服务器
- 非常感谢你
- 这应该是公认的答案,可惜没有
- 杰出的。你的快照真的很有用。谢谢.
- 您不必重新启动服务器。只需关闭并重新打开连接就足够了。
- 在Mac中,首选项位于mysqlworkbench顶部菜单下。
或
去Edit --> Preferences。
单击SQL Queries选项卡,取消选中Safe Updates复选框。
Query --> Reconnect to Server
现在执行SQL查询
如果您处于安全模式,则需要在WHERE子句中提供ID。所以像这样的东西应该管用!
- 本页证实了这一事实:benadel.com/blog/&hellip;
我找到了答案。问题是我必须在表名前面加上模式名。也就是说,命令应该是:
1
| UPDATE schemaname.tablename SET columnname =1; |
谢谢大家。
- 您可以通过选择左侧面板上的模式来避免提及模式名称。在左侧面板中选择架构意味着您正在使用所选架构/数据库。
- 这不是解决问题(和标题)中描述的问题的答案。你应该把另一个标记为接受。
- 我尝试使用SchemaName,但得到了相同的错误,更新qms-active-db.gh_table set bookmark='1660_'
- 这不是答案!
- 回答错误,正确答案由Habiillah回答(如下)
在mysql workbech版本6.2中,不退出preferrencSQLQueries选项。
在这种情况下,可以使用:
SET SQL_SAFE_UPDATES=0;。
- 它存在,但选项现在位于"SQL编辑器"下。
- 我看不出这个选项。请你截图。谢谢
- 打开底部的"首选项"->"SQL编辑器"选项卡>。一个6.2测试版缺少这个选项,所以您可能需要升级到6.2.3+。
- 谢谢,我的版本是6.2.1。升级…
- 我的版本是6.3,它在——>SQL编辑器——>其他
最简单的解决方案是定义行限制并执行。这样做是为了安全。
- +1关于这个解决方案。从表中删除,其中column='xyz'limit 9999999999
- 这个答案应该是公认的答案,因为它是最不安全的方法。
因为这个问题得到了回答,与安全更新无关,所以这可能是错误的地方;我将发布只是为了添加信息。
我试图成为一个好公民,并修改了查询以使用ID的临时表,该表将得到更新:
失败。将更新修改为:
效果不错。很好——如果我总是添加where键<>0来绕过安全更新检查,或者甚至设置了sql-safe-update=0,那么我的查询就失去了"检查"。我也可以永远关掉这个选项。我想它会删除和更新一个两步的过程,而不是一个。但是,如果你打字足够快,不要再考虑钥匙的特殊性,而只是一个麻烦。
对大多数例子来说,这是毫无意义的。但最后,我得出了以下声明,它工作得很好:
这适用于Mac,但对于其他操作系统必须相同,除了首选项的位置。
尝试不安全的DELETE操作时出错。
在新窗口中,取消选中选项Safe Updates。
然后关闭并重新打开连接。无需重新启动服务。
现在我们将再次尝试DELETE,并取得成功。
那么,这些安全更新的全部内容是什么呢?这不是坏事。这就是MySQL所说的。
使用--safe-updates选项
For beginners, a useful startup option is --safe-updates (or
--i-am-a-dummy, which has the same effect). It is helpful for cases when you might have issued a DELETE FROM tbl_name statement but
forgotten the WHERE clause. Normally, such a statement deletes all
rows from the table. With --safe-updates, you can delete rows only by
specifying the key values that identify them. This helps prevent
accidents.
When you use the --safe-updates option, mysql issues the following
statement when it connects to the MySQL server:
1
| SET sql_safe_updates =1, sql_select_limit =1000, sql_max_join_size =1000000; |
在处理生产数据库时,可以安全地打开此选项。否则,必须非常小心,不要意外删除重要数据。
在工作台上,我通过停用安全更新模式解决了这个问题:
-编辑->首选项->SQL编辑器,然后取消选中安全更新。