ChatGPT解决这个技术问题 Extra ChatGPT

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

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

UPDATE tablename SET columnname=1;

它给了我以下错误:

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

我按照说明操作,然后从 Edit 菜单中取消选中 safe update 选项,然后是 Preferences,然后是 SQL Editor。同样的错误仍然出现 &我无法更新此值。请告诉我有什么问题吗?

您是否知道这将更新表中visited = 0 变为visited = 1 的所有行?这是你想要的吗?
取消选中“安全更新”后,请执行以下步骤: Query --> Reconnect to Server 。现在执行您的查询
在此更改生效之前,您必须重新连接到 MySQL 服务器(重新启动 MySQL 连接)。

j
juanes

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

尝试:

SET SQL_SAFE_UPDATES = 0;

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


完成后请务必使用 SET SQL_SAFE_UPDATES = 1 重新设置,因为它是一项有价值的安全功能。
感谢您保持简单。
如果 SQL_SAFE_UPDATES 已经关闭怎么办?然后调用 SET SQL_SAFE_UPDATES = 0 将(再次)关闭它,但在它之后使用 SET SQL_SAFE_UPDATES = 1 最终将在脚本的其余部分打开它,甚至可能覆盖配置的默认值。也许使用 @@SQL_SAFE_UPDATES 读取当前值,然后在后面恢复旧值会是更好的方法?
我访问此答案的次数比任何其他答案都多,您应该获得特别奖,或者我应该记住这一点。
I
Ivar

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

转到编辑->首选项单击“SQL编辑器”选项卡并取消选中“安全更新”复选框查询->重新连接到服务器//注销然后登录现在执行您的SQL查询

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


对于 6.3 版,第 2 步应该是 "Sql Editor" 而不是 "Sql Queries",然后在底部有一个用于 "Safe Updates" 的复选框
我的工作台的编辑菜单下没有首选项
这很有帮助。谢谢。
顺便说一句,如果您看不到“安全模式”选项,请尝试通过单击并按住右下角并拉动来调整对话框的大小。在 Ubuntu 上,这些选项隐藏在 1920x1080 屏幕上。
J
Joundill
SET SQL_SAFE_UPDATES = 0;

# your code SQL here

SET SQL_SAFE_UPDATES = 1;

请将此答案标记为正确答案?谢谢 :)
u
user2531028
SET SQL_SAFE_UPDATES=0;
UPDATE tablename SET columnname=1;
SET SQL_SAFE_UPDATES=1;

R
Rudy De Volder

无需将 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.

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


哈哈,这是个好技巧。我使用 WHERE id > 0 作为这一行的一个技巧。
它对我不起作用,它继续向我显示相同的消息。我通过停用安全更新模式来解决它: -Edit -> Preferences -> Sql Editor 然后取消选中安全更新。
但是,这实际上如何使它更安全?
这里的所有其他评论都是误导性的,您已经设法让我们知道为什么会出现解决方案,而不是如何绕过它。如果您通过在 where 子句中包含主键列来提及为什么现在查询是安全的(尽管可以通过谷歌搜索),那也很棒。太感谢了 ;)
@MattMessersmith 此功能试图阻止您基于可能影响(因此意外更改或删除)大部分或所有行的非键列进行更新/删除。此答案的建议不会使查询更安全,它是绕过其他有用的安全功能而不永久禁用它的解决方法。此解决方案不适用于生产代码,而是用于您手动运行的查询。通过这种方式,安全功能使您在输入查询时意识到查询的影响。
k
kuttan pillai

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

SET SQL_SAFE_UPDATES = 0;

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


欢迎来到 SO,请务必阅读 tour pagehelp page,并避免发布此类答案,因为此答案下方的许多答案都说完全相同的内容,并且已在几个月前发布
您也可以在运行查询后再次启用此选项。
这个答案增加了什么?两年多后,你刚刚发布了与 Habibillah 相同的内容。试图收获业力?
T
Tính Ngô Quang

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

https://i.stack.imgur.com/terJd.png

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

a
andrew

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

https://i.stack.imgur.com/101Ys.png

https://i.stack.imgur.com/sDVA1.png


这应该是公认的答案。可惜没有
您不必重新启动服务器。只需关闭并重新打开连接就足够了。
在 MAC 中,首选项位于 MySQLWorkbench 顶部菜单下。
R
Renier
SET SQL_SAFE_UPDATES=0;

或者

转到 Edit --> Preferences

单击 SQL Queries 标签并取消选中 Safe Updates 复选框

Query --> Reconnect to Server

现在执行你的 sql 查询


G
Gilsha

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

UPDATE tablename SET columnname=1 where id>0

此页面证实了这一事实:bennadel.com/blog/…
如果删除 DELETE FROM tablename WHERE id > 0 有效。谢谢
A
Abdelhadi Lahlou

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

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


R
Ruwantha

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


对此解决方案 +1。从表中删除其中列 = 'xyz' 限制 9999999999
这个答案应该是公认的答案,因为它是最不安全的方式。
K
Knowledge Craving

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

UPDATE schemaname.tablename SET columnname=1;

谢谢大家。


您可以通过在左侧面板中选择架构来避免提及架构名称。在左侧面板中选择架构意味着您正在使用选定的架构/数据库
这不是解决问题(和标题)中描述的问题的答案。您应该将另一个标记为已接受。
我尝试使用 schemaname 但得到同样的错误,更新 qms-active-db.gh_table set bookmark='1660_207100000001000'
这不是答案!
错误答案,正确答案由 Habibillah 回答(下)
f
ferdiado

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

设置 SQL_SAFE_UPDATES=0;


它存在,但该选项现在位于“SQL 编辑器”下。
我没有看到这个选项。请你可以得到一个截图。谢谢
打开 Preferences --> SQL Editor 选项卡 --> 在底部。 6.2-beta 版本缺少此选项,因此您可能需要升级到 6.2.3+。
我的版本是6.3,在-->SQL Editor-->Other
u
urig

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

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


J
Jainmiah

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

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

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


就我而言,我只有这一部分“要禁用安全模式,请切换首选项 - > SQL 编辑器中的选项并重新连接。”我不明白为什么。谢谢小费
S
Sonic-Mayhem

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

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

K
Krishnadas PC

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

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

https://i.stack.imgur.com/edTvd.png

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

https://i.stack.imgur.com/Kww6O.png

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

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

https://i.stack.imgur.com/rZPBu.png

那么这个安全更新的全部内容是什么?这不是一件邪恶的事情。这就是 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;

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


H
Hilal Aissani

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


a
alayor

如果您在存储过程中遇到此问题并且无法在 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$

S
Sercan

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

我的建议是编写一个 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;

N
Nwankwo Fortune

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

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


F
Feridun

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

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

这是为了安全更新。

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


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅