MySQL错误代码:1175在MySQL Workbench中进行UPDATE期间


816

我正在尝试更新该列visited以为其赋予值1。我使用MySQL工作台,并从工作台内部的SQL编辑器中编写语句。我正在编写以下命令:

UPDATE tablename SET columnname=1;

它给了我以下错误:

您正在使用安全更新模式,并且试图更新不具有使用KEY列的WHERE的表。要禁用安全模式,请切换选项...。

我跟着指示,我不加以制止,safe update从选项Edit菜单,然后PreferencesSQL Editor。仍然出现相同的错误,我无法更新此值。拜托,告诉我哪里错了?


4
您是否知道这会将表中已访问= 0的所有行更新为已访问= 1?这是你想要的吗?
Mark Byers

23
取消选中“安全更新”后,请执行以下步骤:查询->重新连接到服务器。现在执行查询
Ripon Al Wasim

5
在此更改生效之前,您必须重新连接到MySQL Server(重新启动MySQL连接)。
菲利普·奥尔森

Answers:


1611

看来您的MySql会话已设置了safe-updates选项。这意味着如果不在primary keywhere子句中指定键(例如),就无法更新或删除记录。

尝试:

SET SQL_SAFE_UPDATES = 0;

或者,您可以修改查询以遵循规则(primary key在中使用where clause)。


我提到我已经从GUI禁用了安全更新选项,其作用与我键入命令的id相同。但是,感谢您的回答,但我已经回答了我的问题。检查我的答案以了解问题所在。
陪审团

8
在GUI中更改选项后,需要重新连接到数据库以正确设置设置。
Tim Koscielski 2014年

31
SET SQL_SAFE_UPDATES = 1完成此操作后,请务必将其设置回去,因为它是一项值得保护的安全功能。
–StockB

4
我不同意StockB ...在更好地使用SQL的同时,您可能希望继续使用它。但是一旦您知道自己在做什么...那件事就完全没有用了。无论如何,您都不应该在生产服务器上开发自己的东西,因此,即使您搞砸了,您唯一要打破的就是您的开发服务器。
Mathieu Turcotte

3
我只是说过去6个月里,我搜索该帖子的次数大约是20次,因为我11年来一直将这个选项设置为false,但是现在我正在与一家致力于开发和生产该产品的公司合作。有很多原因默认将其设置为0,例如,当您开发独立功能时,您可能希望直接导出到csv,然后将其标记为已导出或类似名称。有时由于全局更新而很烦,因为它显然没有任何pk过滤器。我将其更多地看作是菜鸟保护,而不是真正有用的功能。
JoelBonetR

454

在执行UPDATE命令之前,请按照以下步骤操作: 在MySQL Workbench中

  1. 转到Edit->Preferences
  2. 点击"SQL Editor"标签和uncheck“安全更新”check box
  3. Query-> Reconnect to Server //注销然后登录
  4. 现在执行您的SQL查询

ps,无需重新启动MySQL守护程序!


20
对于版本6.3,应该使用步骤2 "Sql Editor"代替,"Sql Queries"然后在底部有一个复选框"Safe Updates"
meconroy'8

1
如果这是一次性的事情,我建议您重新打开它,因为如果您不小心,可以很轻松地对数据进行皇家处理
Frankenmint 2016年

2
谢谢康罗伊。有一阵子我看不到那个盒子。我只需要放大窗户。
arn-arn

也许他们移动了它,但是在MySQL Workbench 6.0中,它位于“ SQL查询”下,而不是“ SQL编辑器”下
MPelletier

1
是的,这里也一样,必须向下滚动一点才能看到它。
伊隆·齐托

167
SET SQL_SAFE_UPDATES=0;
UPDATE tablename SET columnname=1;
SET SQL_SAFE_UPDATES=1;

4
不幸的是,其他基于查询的解决方案对我不起作用。但是这个做到了!感谢您添加一行以重新打开安全更新。
SherylHohman

1
我真的很喜欢这个,因为它可能是最通用的,同时仍然保持安全。
Nae

117

无需将SQL_SAFE_UPDATES设置为0,我真的不建议这样做。默认情况下,SAFE_UPDATES在REASON上处于启用状态。如果您知道我的意思,您可以开车不戴安全带和其他东西;

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.

现在,您可以放心,每条记录都会(ALWAYS)按您的期望进行更新。


3
这是天才!
阿莫斯(Amos Long)

赞赏的答案:+1
Asif Raza

2
哈哈,这是个好把戏。我WHERE id > 0沿这条路线用作技巧。
Csaba Toth

它对我不起作用,它继续向我显示相同的消息。我通过以下方法停用了安全更新模式来解决它:-编辑->首选项-> Sql编辑器,然后取消选中安全更新。
阿卜杜勒哈迪·拉鲁

2
但是,实际上如何使它更安全?
Matt Messersmith

106

所需要做的就是:启动一个新查询并运行:

SET SQL_SAFE_UPDATES = 0;

然后:运行您之前尝试运行的查询。


7
欢迎来到SO,请务必阅读游览页面帮助页面,并避免发布像这样的答案,因为该答案下面的许多答案都说的完全一样,并且已在几个月前发布
WOUNDEDStevenJones 2014年

1
您也可以在运行查询后再次启用此选项。
kta

这个答案增加了什么?两年多后,您刚刚发布了与哈比比拉相同的内容。试图收获业力?
卢克,


66

错误代码:1175。您正在使用安全更新模式,并且尝试更新不具有使用KEY列的WHERE的表。要禁用安全模式,请在“首选项”->“ SQL编辑器”中切换选项,然后重新连接。

暂时关闭“安全更新模式”

SET SQL_SAFE_UPDATES = 0;
UPDATE options SET title= 'kiemvieclam24h' WHERE url = 'http://kiemvieclam24h.net';
SET SQL_SAFE_UPDATES = 1;

永远关闭“安全更新模式”

Mysql工作台8.0:

MySQL Workbench => [ Edit ] => [ Preferences ] -> [ SQL Editor ] -> Uncheck "Safe Updates"

在此处输入图片说明 旧版本可以:

MySQL Workbench => [Edit] => [Preferences] => [SQL Queries]

41
  1. 偏好...
  2. “安全更新” ...
  3. 重新启动服务器

偏好...

安全更新 重新启动服务器


这本来应该是被接受的答案。很遗憾,事实并非如此
ErrorrrDetector

1
您不必重新启动服务器。只需关闭并重新打开连接就足够了。
Marc L.

1
在MAC中,首选项位于MySQLWorkbench顶部菜单下。
zwitterion

36
SET SQL_SAFE_UPDATES=0;

要么

Edit --> Preferences

单击 SQL Queries选项卡,然后取消 Safe Updates选中复选框

Query --> Reconnect to Server

现在执行您的SQL查询




17

我找到了答案。问题是我必须在表名之前加上架构名。即,命令应为:

UPDATE schemaname.tablename SET columnname=1;

谢谢大家


5
您可以通过在左侧面板中选择架构来避免提及架构名称。在左侧面板中选择架构意味着您正在使用所选的架构/数据库
Ripon Al Wasim 2013年

10
这不是解决问题(和标题)中描述的问题的答案。您应将另一个标记为已接受。
T30年

我尝试使用schemaname,但遇到相同的错误,更新qms-active-db.gh_table设置书签='1660_207100000001000'–
Code_Mode

3
这不是答案!
以西结·维克多

1
错误的答案,正确的答案由Habibillah回答(下)
hariharan s

14

在MySQL Workbech 6.2版中,不要退出“首SQLQueries选项” 选项。

在这种情况下,可以使用: SET SQL_SAFE_UPDATES=0;


1
它存在,但是该选项现在在“ SQL编辑器”下。
菲利普·奥尔森

我看不到这个选项。请获取屏幕截图。谢谢
ferdiado 2014年

打开首选项-> SQL编辑器选项卡->在底部。6.2-beta版本缺少此选项,因此也许您需要升级到6.2.3+。
菲利普·奥尔森2014年

我的版本是6.3,位于-> SQL编辑器->其他
tyan

12

最简单的解决方案是定义行限制并执行。出于安全目的而进行。


2
此解决方案+1。从表中删除,其中列=“ xyz”限制9999999999
FlyingZebra1

2
该答案应该是公认的答案,因为它是最不安全的方法。
朱利安

7

由于问题已得到回答且与安全更新无关,因此这可能是错误的地方;我将仅添加信息。

我试图成为一个好公民,并修改了查询以使用将要更新的id的临时表:

create temporary table ids ( id int )
    select id from prime_table where condition = true;
update prime_table set field1 = '' where id in (select id from ids);

失败。将更新修改为:

update prime_table set field1 = '' where id <> 0 and id in (select id from ids);

那行得通。好极了-如果我总是在哪里添加键<> 0来避开安全更新检查,甚至设置SQL_SAFE_UPDATE = 0,那么我就失去了查询的“检查”。我也可以永久关闭该选项。我想它使删除和更新过程分为两个步骤,而不是一个步骤。.但是,如果您键入速度足够快,并且不再考虑该键是特殊的,而只是讨厌的话。


4

没错,对于大多数示例而言,这毫无意义。但是最后,我来到了下面的语句,它运行良好:

update tablename  set column1 = '' where tablename .id = (select id from tablename2 where tablename2.column2 = 'xyz');

3

这适用于Mac,但其他操作系统必须相同,但首选项的位置除外。

尝试不安全DELETE操作时收到的错误

出现此错误时,请单击首选项

在新窗口中,取消选中该选项 Safe updates

取消选中安全更新

然后关闭并重新打开连接。无需重新启动服务。

现在,我们将DELETE再次尝试以成功的结果。

在此处输入图片说明

那么,此安全更新到底有什么用呢?这不是邪恶的事情。这就是MySql所说的。

使用--safe-updates选件

对于初学者来说,一个有用的启动选项是--safe-updates(或 --i-am-a-dummy,具有相同的效果)。在您可能已发出DELETE FROM tbl_name声明但忘记了该WHERE子句的情况下,这很有用。通常,这样的语句从表中删除所有行。用--safe-updates,您只能通过指定标识行的键值来删除行。这有助于防止事故发生。

当您使用该--safe-updates选项时,mysql在连接到MySQL服务器时会发出以下语句:

SET sql_safe_updates=1, sql_select_limit=1000, sql_max_join_size=1000000;

在处理生产数据库时可以安全地打开此选项。否则,您必须非常小心,不要意外删除重要数据。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.