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

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

 UPDATE tablename SET columnname=1; 

它给了我以下错误:

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

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

它看起来像你的MySql会话有安全更新选项设置。 这意味着如果没有在where子句中指定键(例如primary key ),则不能更新或删除logging。

尝试:

 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注销,然后login
  4. 现在执行你的SQL查询

ps,不需要重启MySQL守护进程!

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

所有需要的是:开始一个新的查询并运行:

 SET SQL_SAFE_UPDATES = 0; 

然后:运行您正在尝试运行的查询以前不工作。

 SET SQL_SAFE_UPDATES=0; 

要么

转到 Edit --> Preferences

单击 SQL Queries选项卡并取消选中 Safe Updatescheckbox

Query --> Reconnect to Server

现在执行你的sql查询

  1. 优先…
  2. “安全更新”…
  3. 重新启动服务器

优先...

安全更新 重新启动服务器

不需要将SQL_SAFE_UPDATES设置为0 ,我真的不打算这样做。 只需在WHERE子句中添加一个与主键相比一切都与0相匹配的KEY值,而不是写入:

 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. 

现在你可以放心,每一个logging都像你期望的那样更新。

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

 UPDATE tablename SET columnname=1 where id>0 

我find了答案。 问题是我必须在表名和模式名之前。 即命令应该是:

 UPDATE schemaname.tablename SET columnname=1; 

谢谢大家。

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

在这种情况下,可以使用: SET 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 field 1 = '' where id <> 0 and id in (select id from ids); 

这工作。 好吧,如果我总是添加钥匙<> 0以避开安全更新检查,甚至设置SQL_SAFE_UPDATE = 0,那么我已经失去了对我的查询“检查”。 我不如永远closures这个选项。 我想这使得删除和更新两个步骤的过程,而不是一个..但如果你打字速度不够,不要想着关键是特殊的,而只是一个滋扰..

诚然,对大多数例子来说,这是毫无意义的。 但最后,我来到以下声明,它工作正常:

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

最简单的解决scheme是定义行限制和执行。 这是为了安全目的而完成的。