MySQL错误码:1175在MySQL Workbench中更新

我试图更新列visited给它的值1。我使用MySQL工作台,我从工作台内部在SQL编辑器中编写语句。我正在写下面的命令:

UPDATE tablename SET columnname=1;

它给了我以下错误:

您正在使用安全更新模式,并且您试图在没有更新表的情况下更新表若要禁用安全模式,请切换该选项…< / p >

我按照说明,我从Edit菜单中取消了safe update选项,然后是Preferences,然后是SQL Editor。同样的错误仍然出现&我无法更新这个值。求你了,告诉我怎么了?

2527029 次浏览

我找到了答案。问题是我必须在表名之前加上模式名。也就是说,命令应该是:

UPDATE schemaname.tablename SET columnname=1;

谢谢所有。

看起来你的MySql会话有safe-updates选项集。这意味着如果在where子句中没有指定键(例如primary key),就不能更新或删除记录。

试一试:

SET SQL_SAFE_UPDATES = 0;

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

执行UPDATE命令前请遵循以下步骤:在MySQL Workbench中

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

另外,不需要重新启动MySQL守护进程!

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

# 1 # 0

点击 SQL Queries选项卡和取消 Safe Updates复选框

# 0

现在执行sql查询

在MySQL Workbech版本6.2中,不要退出PreferenceSQLQueries选项。

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

不需要将SQL_SAFE_UPDATES设置为0,我真的不鼓励这样做。SAFE_UPDATES默认开启是有原因的。你可以不用安全带和其他东西开车,如果你知道我的意思;)只需在WHERE子句中添加一个KEY-value,它匹配所有内容,例如与0比较的主键,因此不用写:

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.

现在你可以放心,每一个记录(总是)更新如你所期望的。

既然这个问题已经得到了回答,而且与安全更新没有任何关系,那么这里可能是错误的地方;我将发布补充信息。

我试图成为一个好公民,并修改了查询,使用临时表的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);

这工作。好吧,天哪——如果我总是添加where key <> 0来绕过安全更新检查,甚至设置SQL_SAFE_UPDATE=0,那么我已经在我的查询中丢失了“检查”。我还不如永远关闭这个选项。我想它会让删除和更新变成两个步骤,而不是一个步骤。但如果你打得足够快,不再认为钥匙是特殊的,而只是一个讨厌的东西。

如果处于安全模式,则需要在where子句中提供id。所以像这样的东西应该可以工作!

UPDATE tablename SET columnname=1 where id>0

的确,对于大多数例子来说,这是毫无意义的。但最后,我得到了以下声明,它很有效:

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

最简单的解决方案是定义行限制并执行。这样做是为了安全。

  1. 首选项…
  2. “安全更新”……
  3. 重新启动服务器

Preferences… < / >

Safe Updates# 0 < / p >

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

当我们尝试不安全的DELETE操作时所得到的错误

当你得到这个错误时点击首选项

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

Uncheck the safe updates

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

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

enter image description here

那么这些安全更新到底是怎么回事呢?这不是一件坏事。这就是MySql的说法。

使用--safe-updates选项

对于初学者,一个有用的启动选项是--safe-updates(或--safe-updates)--i-am-a-dummy,具有相同的效果)。这对于你可能已经发布了一个DELETE FROM tbl_name声明的情况很有帮助忘记了WHERE子句。通常,这样的语句会删除所有内容表中的行。使用--safe-updates,您只能通过指定标识它们的键值。这有助于预防事故。< / p > 当你使用--safe-updates选项时,mysql会发出以下问题

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

当您处理生产数据库时,打开此选项是安全的。否则,你必须非常小心,不要不小心删除重要的数据

错误码: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"

enter image description here旧版本可以:

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

在工作台上,我通过禁用安全更新模式解决了这个问题:

-编辑->首选项-> Sql编辑器然后取消安全更新。

SET SQL_SAFE_UPDATES = 0;
# your code SQL here
SET SQL_SAFE_UPDATES = 1;

只是键入SET SQL_SAFE_UPDATES = 0;在删除或更新之前,重新设置为1SET SQL_SAFE_UPDATES = 1

我也遇到了同样的问题,但当我在编辑中关闭“安全更新”时->偏好→SQL编辑器->安全更新,依然是我用来面对的错误码1175禁用安全模式

我对这个错误的解决方案只是给出了表的主键,如果没有给出,并使用这些主键值更新列。

例如:更新[表名] Empty_Column = 'Value' WHERE[主键列名]= value;

.

如果您在存储过程中遇到了这个问题,并且您不能在WHERE子句中使用键,那么您可以通过声明一个变量来解决这个问题,该变量将保留应该更新的行数的限制,然后在更新/删除查询中使用它。

DELIMITER $CREATE PROCEDURE myProcedure()BEGINDECLARE the_limit INT;
SELECT COUNT(*) INTO the_limitFROM my_tableWHERE my_column IS NULL;        
UPDATE my_tableSET my_column = trueWHERE my_column IS NULLLIMIT the_limit;END$

正如在以前的文章中所述,更改数据库服务器的默认设置将导致对已发布项目中的数据进行不正确的查询,从而导致对现有数据的不希望的修改。因此,要实现前面文章中所述的命令,有必要在测试环境中对示例数据运行它们,然后在正确测试后执行它们。

我的建议是,如果更新应该对表中的所有行有效,则编写WHERE条件语句,循环遍历所有条件下的所有行。例如,如果表中包含一个ID值,条件ID > 0可以用来选择所有行:

/*** For successful result, "id" column must be "Not Null (NN)" and defined in* INT data type. In addition, the "id" column in the table must have PK, UQ* and AI attributes.*/UPDATE schema_name.table_nameSET first_column_name = first_value, second_column_name = second_value, ...WHERE id > 0;

如果表中不包含id列,更新操作可以通过检查一个不能为空的列在所有行上运行:

/*** "first_column_name" column must be "Not Null (NN)" for successful result.*/UPDATE schema_name.table_nameSET first_column_name = first_value, second_column_name = second_value, ...WHERE table_name.first_column_name IS NOT NULL;

MySql工作台给了我同样的错误,在我取消安全模式后,我重新连接服务器,更新功能工作。进入菜单栏的“查询”,重新连接

服务器

查询菜单->重新连接服务器

< p >:请确保您想要更新该表中的所有记录,因为如果没有where子句,更新该表中的所有记录是危险的。你很少想要更新表中的所有记录

大多数时候你想要更新特定的记录,其中应该包括where从句,如果你想要更新所有的记录,打开MySQL workbench>Edit>SQL编辑器>向右向下滚动并取消选中“安全更新(拒绝更新和删除,没有限制)”。

这是为了安全更新。

如果您取消选中上面所说的,那么您可能会更新所有记录,而不是导致数据库备份恢复的一条记录。没有回滚。

我只是在最后添加了提交;