【问题标题】:MySQL error code: 1175 during UPDATE in MySQL WorkbenchMySQL 错误代码:在 MySQL Workbench 中更新期间出现 1175
【发布时间】:2012-07-11 23:32:35
【问题描述】:

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

UPDATE tablename SET columnname=1;

它给了我以下错误:

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

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

【问题讨论】:

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

标签: mysql sql-update mysql-workbench


【解决方案1】:

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

UPDATE schemaname.tablename SET columnname=1;

谢谢大家。

【讨论】:

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

看起来您的 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 读取当前值,然后恢复旧值后缀会更好?
  • 我访问这个答案的次数比任何其他关于 SO 的答案都多,你应该获得特别奖,或者我应该记住这一点。
【解决方案3】:

在执行 UPDATE 命令之前,请执行以下步骤: 在 MySQL 工作台中

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

p.s.,无需重启 MySQL 守护进程!

【讨论】:

  • 对于 6.3 版,第 2 步应该是 "Sql Editor" 而不是 "Sql Queries",然后在底部有一个 "Safe Updates" 复选框
  • 我的工作台的编辑菜单下没有首选项
  • 这很有帮助。谢谢。
【解决方案4】:
SET SQL_SAFE_UPDATES=0;
UPDATE tablename SET columnname=1;
SET SQL_SAFE_UPDATES=1;

【讨论】:

    【解决方案5】:
    SET SQL_SAFE_UPDATES=0;
    

    转到Edit --> Preferences

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

    Query --> Reconnect to Server

    现在执行你的 sql 查询

    【讨论】:

      【解决方案6】:

      在 MySQL Workbech 6.2 版中,不要退出 PreferenceSQLQueriesoptions。

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

      【讨论】:

      • 存在,但选项现在在“SQL编辑器”下。
      • 我没有看到这个选项。请你可以得到一个截图。谢谢
      • 打开首选项 --> SQL 编辑器选项卡 --> 在底部。 6.2-beta 版本缺少此选项,因此您可能需要升级到 6.2.3+。
      • 我的版本是6.3,在 -->SQL Editor -->Other
      【解决方案7】:

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

      SET SQL_SAFE_UPDATES = 0;
      

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

      【讨论】:

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

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

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

      【讨论】:

      • 哈哈,这个技巧不错。我使用WHERE id &gt; 0 作为这条线的一个技巧。
      • 它对我不起作用,它继续向我显示相同的消息。我通过停用安全更新模式来解决它: -Edit -> Preferences -> Sql Editor 然后取消选中 Safe update。
      • 这实际上如何使它更安全?
      • 这里的所有其他评论都是误导性的,您已经设法让我们知道为什么会出现解决方案,而不是如何绕过它。如果您通过在 where 子句中包含主键列来提及为什么现在查询是安全的(尽管可以通过谷歌搜索),那也很棒。非常感谢;)
      • @MattMessersmith 此功能试图阻止您基于可能影响(因此意外更改或删除)大部分或所有行的非键列进行更新/删除。此答案的建议不会使查询更安全,它是绕过其他有用的安全功能而不永久禁用它的解决方法。此解决方案不适用于生产代码,而是用于您手动运行的查询。通过这种方式,安全功能可以让您在输入查询时意识到查询的影响。
      【解决方案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,那么我的查询就丢失了“检查”。我还不如永久关闭该选项。我想它使删除和更新一个两步过程而不是一个..但是如果你输入足够快并且不再考虑密钥是特殊的而是只是一个麻烦..

      【讨论】:

        【解决方案10】:

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

        UPDATE tablename SET columnname=1 where id>0
        

        【讨论】:

        • 这个页面证实了这个事实:bennadel.com/blog/…
        • 如果删除DELETE FROM tablename WHERE id &gt; 0 有效。谢谢
        【解决方案11】:

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

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

        【讨论】:

          【解决方案12】:

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

          【讨论】:

          • 对此解决方案 +1。从 TABLE 中删除其中 column = 'xyz' 限制 9999999999
          • 这个答案应该是公认的答案,因为它是最不安全的方式。
          【解决方案13】:
          1. 首选项...
          2. “安全更新”...
          3. 重启服务器

          【讨论】:

          • 这应该是公认的答案,可惜没有得到
          • 您不必重新启动服务器。只需关闭并重新打开连接就足够了。
          • 在 MAC 中,首选项位于 MySQLWorkbench 顶部菜单下。
          【解决方案14】:

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

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

          【讨论】:

            【解决方案15】:

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

            【讨论】:

              【解决方案16】:

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

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

              【讨论】:

                【解决方案17】:
                SET SQL_SAFE_UPDATES = 0;
                
                # your code SQL here
                
                SET SQL_SAFE_UPDATES = 1;
                

                【讨论】:

                • 请将此答案标记为正确答案?谢谢:)
                【解决方案18】:

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

                【讨论】:

                  【解决方案19】:

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

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

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

                  【讨论】:

                  • 就我而言,我只有这一部分“要禁用安全模式,请切换首选项 -> SQL 编辑器中的选项并重新连接。”我不明白为什么。谢谢提示
                  【解决方案20】:

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

                  【讨论】:

                    【解决方案21】:

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

                    我的建议是编写一个WHERE 条件语句,如果更新应该适用于表中的所有行,它将遍历所有条件下的所有行。例如,如果表中包含一个 ID 值,则可以使用条件ID &gt; 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;
                    

                    【讨论】:

                      猜你喜欢
                      • 2017-05-31
                      • 2018-08-25
                      • 2012-12-23
                      • 2015-03-27
                      • 2022-01-04
                      • 1970-01-01
                      • 2017-05-15
                      • 2021-11-23
                      相关资源
                      最近更新 更多