我正在尝试更新列 visited
以赋予其值 1。我使用 MySQL 工作台,并且我正在从工作台内部的 SQL 编辑器中编写语句。我正在编写以下命令:
UPDATE tablename SET columnname=1;
它给了我以下错误:
您正在使用安全更新模式,并且您尝试更新没有使用 KEY 列的 WHERE 的表 要禁用安全模式,请切换选项 ...。
我按照说明操作,然后从 Edit
菜单中取消选中 safe update
选项,然后是 Preferences
,然后是 SQL Editor
。同样的错误仍然出现 &我无法更新此值。请告诉我有什么问题吗?
看起来您的 MySql 会话设置了 safe-updates option。这意味着您不能在 where 子句中不指定键(例如 primary key
)的情况下更新或删除记录。
尝试:
SET SQL_SAFE_UPDATES = 0;
或者,您可以修改查询以遵循规则(在 where clause
中使用 primary key
)。
在执行 UPDATE 命令之前按照以下步骤操作: 在 MySQL Workbench 中
转到编辑->首选项单击“SQL编辑器”选项卡并取消选中“安全更新”复选框查询->重新连接到服务器//注销然后登录现在执行您的SQL查询
ps,无需重启MySQL守护进程!
"Sql Editor"
而不是 "Sql Queries"
,然后在底部有一个用于 "Safe Updates"
的复选框
SET SQL_SAFE_UPDATES = 0;
# your code SQL here
SET SQL_SAFE_UPDATES = 1;
SET SQL_SAFE_UPDATES=0;
UPDATE tablename SET columnname=1;
SET SQL_SAFE_UPDATES=1;
无需将 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
作为这一行的一个技巧。
错误代码: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]
首选项...“安全更新”...重新启动服务器
https://i.stack.imgur.com/101Ys.png
https://i.stack.imgur.com/sDVA1.png
SET SQL_SAFE_UPDATES=0;
或者
转到 Edit --> Preferences
单击 SQL Queries
标签并取消选中 Safe Updates
复选框
Query --> Reconnect to Server
现在执行你的 sql 查询
如果您处于安全模式,则需要在 where 子句中提供 id。所以这样的事情应该有效!
UPDATE tablename SET columnname=1 where id>0
DELETE FROM tablename WHERE id > 0
有效。谢谢
在 WorkBench 上,我通过停用安全更新模式解决了这个问题:
-Edit -> Preferences -> Sql Editor 然后取消选中安全更新。
最简单的解决方案是定义行限制并执行。这样做是出于安全目的。
我找到了答案。问题是我必须在表名之前加上模式名。即,命令应该是:
UPDATE schemaname.tablename SET columnname=1;
谢谢大家。
qms-active-db
.gh_table set bookmark='1660_207100000001000'
在 MySQL Workbech 6.2 版中,不要退出 PreferenceSQLQueries
选项。
设置 SQL_SAFE_UPDATES=0;
由于问题已得到回答并且与安全更新无关,因此这可能是错误的地方;我会发布只是为了添加信息。
我试图成为一个好公民,并修改了查询以使用可以更新的 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,那么我的查询就丢失了“检查”。我还不如永久关闭该选项。我想它使删除和更新一个两步过程而不是一个..但是如果你输入得足够快并且停止考虑密钥是特殊的而只是一个麻烦..
我也遇到了同样的问题,但是当我在“编辑”->“首选项”->“SQL 编辑器”->“安全更新”中关闭“安全更新”时,我仍然会遇到“错误代码 1175 禁用安全模式”的错误
我对这个错误的解决方案是如果没有给出表的主键,并使用这些主键值更新列。
例如:UPDATE [表名] SET Empty_Column = 'Value' WHERE [主键列名] = value;
诚然,这对于大多数示例来说毫无意义。但最后,我得出以下声明,它工作正常:
update tablename set column1 = '' where tablename .id = (select id from tablename2 where tablename2.column2 = 'xyz');
这适用于 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;
在处理生产数据库时打开此选项是安全的。否则,您必须非常小心,不要意外删除重要数据。
只需键入 SET SQL_SAFE_UPDATES = 0;在删除或更新之前再次设置为 1 SET SQL_SAFE_UPDATES = 1
如果您在存储过程中遇到此问题并且无法在 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$
如前文所述,更改数据库服务器的默认设置将导致对已发布项目中数据的错误查询导致对现有数据的意外修改。因此,要实现前文所述的命令,需要在样本数据的测试环境中运行它们,然后在正确测试后执行它们。
我的建议是编写一个 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;
MySql 工作台给了我同样的错误,在我取消选中安全模式后,我重新连接了服务器并且更新功能起作用了。转到菜单栏中的查询并重新连接服务器
查询菜单 -> 重新连接到服务器
首先:请确保您要更新该表中的所有记录,因为如果没有 where 子句,更新该表中的所有记录是危险的。您很少需要更新表中的所有记录。
大多数情况下,您想更新特定记录,如果您想再次更新所有记录,则应包括 where cluase 打开 MySQL 工作台 > 编辑 > 首选项 > SQL 编辑器 > 向右向下滚动并取消选中“安全更新(拒绝更新和删除)没有限制)”。
这是为了安全更新。
如果您取消选中上述内容,那么您可能会更新所有记录而不是一条记录,这会导致数据库备份恢复。没有回滚。
不定期副业成功案例分享
SET SQL_SAFE_UPDATES = 1
重新设置,因为它是一项有价值的安全功能。SQL_SAFE_UPDATES
已经关闭怎么办?然后调用SET SQL_SAFE_UPDATES = 0
将(再次)关闭它,但在它之后使用SET SQL_SAFE_UPDATES = 1
最终将在脚本的其余部分打开它,甚至可能覆盖配置的默认值。也许使用@@SQL_SAFE_UPDATES
读取当前值,然后在后面恢复旧值会是更好的方法?