1049

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

UPDATE tablename SET columnname=1;

它给了我以下错误:

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

我按照说明进行操作,然后safe updateEdit菜单中取消选中该选项。仍然出现相同的错误,我无法更新此值。请告诉我有什么问题吗?PreferencesSQL Editor

4

23 回答 23

2023

看起来您的 MySql 会话设置了安全更新选项。这意味着您不能primary key在 where 子句中不指定键(例如 )的情况下更新或删除记录。

尝试:

SET SQL_SAFE_UPDATES = 0;

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

于 2012-07-12T08:59:50.887 回答
539

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

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

ps,无需重启MySQL守护进程!

于 2013-01-09T09:37:03.253 回答
229
SET SQL_SAFE_UPDATES = 0;

# your code SQL here

SET SQL_SAFE_UPDATES = 1;
于 2019-08-27T22:48:53.700 回答
201
SET SQL_SAFE_UPDATES=0;
UPDATE tablename SET columnname=1;
SET SQL_SAFE_UPDATES=1;
于 2013-07-26T14:42:00.110 回答
151

无需将 SQL_SAFE_UPDATES 设置为 0,我真的不鼓励它这样做。SAFE_UPDATES 默认开启是有原因的。如果您知道我的意思,您可以驾驶没有安全带和其他东西的汽车;)只需在 WHERE 子句中添加一个 KEY 值,该值匹配所有内容,例如与 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.

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

于 2015-02-04T07:46:02.423 回答
112

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

SET SQL_SAFE_UPDATES = 0;

然后:运行您尝试运行但以前无法运行的查询。

于 2014-11-17T13:20:17.620 回答
87

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

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

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]
于 2018-07-31T09:35:18.870 回答
46
  1. 喜好...
  2. “安全更新”...
  3. 重启服务器

喜好...

安全更新 重启服务器

于 2016-02-19T17:37:45.853 回答
36
SET SQL_SAFE_UPDATES=0;

或者

Edit --> Preferences

单击 SQL Queries选项卡并取消 Safe Updates选中复选框

Query --> Reconnect to Server

现在执行你的 sql 查询

于 2013-12-02T13:32:58.083 回答
31

如果您处于安全模式,则需要在 where 子句中提供 id。所以这样的事情应该有效!

UPDATE tablename SET columnname=1 where id>0
于 2015-09-11T09:07:11.620 回答
29

在 WorkBench 上,我通过停用安全更新模式解决了这个问题:

-Edit -> Preferences -> Sql Editor 然后取消选中安全更新。

于 2019-05-20T10:16:40.340 回答
17

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

于 2015-10-30T08:55:34.783 回答
16

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

UPDATE schemaname.tablename SET columnname=1;

谢谢大家。

于 2012-07-12T08:52:58.017 回答
13

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

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

于 2014-09-10T18:46:24.603 回答
9

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

我试图成为一个好公民,并修改了查询以使用可以更新的 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,那么我的查询就丢失了“检查”。我还不如永久关闭该选项。我想它使删除和更新一个两步过程而不是一个..但是如果你输入得足够快并且停止考虑密钥是特殊的而只是一个麻烦..

于 2015-04-20T15:04:35.553 回答
6

我也遇到了同样的问题,但是当我在编辑 -> 首选项 -> SQL 编辑器 -> 安全更新中关闭“安全更新”时,我仍然习惯于面对“错误代码 1175 禁用安全模式”的错误

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

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

于 2020-09-07T16:29:23.250 回答
5

诚然,这对于大多数示例来说毫无意义。但最后,我得出以下声明,它工作正常:

update tablename  set column1 = '' where tablename .id = (select id from tablename2 where tablename2.column2 = 'xyz');
于 2015-10-10T11:05:29.777 回答
4

这适用于 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;

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

于 2018-07-05T07:22:01.727 回答
2

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

DELIMITER $
CREATE PROCEDURE myProcedure()
BEGIN
    DECLARE the_limit INT;

    SELECT COUNT(*) INTO the_limit
    FROM my_table
    WHERE my_column IS NULL;
        
    UPDATE my_table
    SET my_column = true
    WHERE my_column IS NULL
    LIMIT the_limit;
END$
于 2020-10-09T02:59:05.583 回答
2

只需键入 SET SQL_SAFE_UPDATES = 0; 在删除或更新之前再次设置为 1 SET SQL_SAFE_UPDATES = 1

于 2020-08-26T14:08:19.300 回答
1

如前文所述,更改数据库服务器的默认设置将导致对已发布项目中数据的错误查询导致对现有数据的意外修改。因此,要实现前文所述的命令,需要在样本数据的测试环境中运行它们,然后在正确测试后执行它们。

我的建议是编写一个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_name
SET 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_name
SET first_column_name = first_value, second_column_name = second_value, ...
WHERE table_name.first_column_name IS NOT NULL;
于 2021-11-06T03:31:22.200 回答
0

MySql 工作台给了我同样的错误,在我取消选中安全模式后,我重新连接了服务器并且更新功能起作用了。转到菜单栏中的查询并重新连接服务器

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

于 2022-01-08T11:58:05.520 回答
0

首先:请确保您要更新该表中的所有记录,因为如果没有 where 子句,更新该表中的所有记录是危险的。您很少需要更新表中的所有记录。

大多数情况下,您想更新特定记录,如果您想再次更新所有记录,则应包括 where cluase 打开 MySQL 工作台 > 编辑 > 首选项 > SQL 编辑器 > 向右向下滚动并取消选中“安全更新(拒绝更新和删除)没有限制)”。

这是为了安全更新。

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

于 2022-02-15T08:57:55.327 回答