当前位置: 首页 > 知识库问答 >
问题:

不使用SQL_SAFE_UPDATES更新表

杜志
2023-03-14

我正在尝试使用此查询更新一些记录,这基本上只是一种为客户设置“状态”的方法,考虑到他们“自上次订单以来的日子”:

        UPDATE customers AS c1
        INNER JOIN (
          SELECT id, DATEDIFF(NOW(), agg.cdt) AS acdt
          FROM customers
          INNER JOIN
            (
              SELECT c.id AS cid, max(o.datetime) as cdt
              FROM customers AS c
              LEFT JOIN orders o ON o.customer_id = c.id
              WHERE o.state = 20
              GROUP BY c.id
            ) AS agg ON customers.id = agg.cid
          WHERE account_type IN (1, 2)
            AND deleted = 0
            AND (account_management_state IN (0, 1, 2) OR account_management_state IS NULL)
        ) AS c2 ON c1.id = c2.id
        SET c1.account_management_state = CASE
          WHEN c2.acdt <= 90 THEN 0
          WHEN c2.acdt >= 91 AND c2.acdt <= 360 THEN 1
          WHEN c2.acdt > 360 OR c2.acdt IS NULL THEN 2
          END
        WHERE c1.id = c2.id;

但是我得到了:

错误代码: 1175年。您正在使用安全更新模式,并且您尝试更新不使用使用 KEY 列的 WHERE 的表 要禁用安全模式,请切换首选项中的选项 -

我在最终的 WHERE 中使用表键,c1.id客户表键。使用 SET SQL_SAFE_UPDATES = 0; 不是一个选项。我还尝试使用“位置 c1.id

请注意,我试图手动运行查询,将SET SQL_SAFE_UPDATES = 0;,查询按预期工作,但这应该是一个自动过程。

所以我的选择是:

  1. 使用单个查询,SQL_SAFE_UPDATES无法使用
  2. 使用Python游标,可以使用SQL_SAFE_UPDATES。(见侧注)
  3. [在此处插入选项]
  4. (我不想这样做)迭代每个记录(使用Python ORM)并更新记录。这是愚蠢的,而且需要永远

还尝试了:

>

  • 使用相同的标识

    UPDATE
      ...
    WHERE c1.id = c1.id ;
    

    在每个子查询后添加一个巨大的限制(如@Akina所建议的):

    UPDATE customers AS c1
    INNER JOIN (
      SELECT id, DATEDIFF(NOW(), agg.cdt) AS acdt
      FROM customers
      INNER JOIN
        (
          SELECT c.id AS cid, max(o.datetime) as cdt
          FROM customers AS c
          LEFT JOIN orders o ON o.customer_id = c.id
          WHERE o.state = 20
          GROUP BY c.id
          LIMIT 100000000
        ) AS agg ON customers.id = agg.cid
      WHERE account_type IN (1, 2)
        AND deleted = 0
        AND (account_management_state IN (0, 1, 2) OR account_management_state IS NULL)
      LIMIT 100000000
    ) AS c2 ON c1.id = c2.id
    SET c1.account_management_state = CASE
      WHEN c2.acdt <= 90 THEN 0
      WHEN c2.acdt >= 91 AND c2.acdt <= 360 THEN 1
      WHEN c2.acdt > 360 OR c2.acdt IS NULL THEN 2
      END
    WHERE c1.id = c2.id;
    

    两个id的组合:

    UPDATE
      ...
    WHERE c1.id > 0 and c2.id > 0;
    

    它们都不起作用。仍然收到错误代码: 1175

    这是使用MySQL python客户端和游标的Python/Flask进程的一部分。我可以使用SQL_SAFE_UPDATES,只要它是从Python游标完成的。这不起作用:

    >

  • 使用不同的查询(不会抛出错误,只是不会更新任何内容):

    connection = db.get_conn()
    cursor = connection.cursor()
    cursor.execute('SET SQL_SAFE_UPDATES = 0;')
    cursor.execute(query) # from the original query
    cursor.execute('SET SQL_SAFE_UPDATES = 1;')
    

    使用单个查询(不抛出错误,它只是不会更新任何东西):

    connection = db.get_conn()
    cursor = connection.cursor()
    cursor.execute('''
        SET SQL_SAFE_UPDATES = 0;
        UPDATE ...;
        SET SQL_SAFE_UPDATES = 1;
    ''')
    

    使用<代码>开始..END(我想我看到了曙光,但是没有),得到一个< code>ProgrammingError:

    connection = db.get_conn()
    cursor = connection.cursor()
    cursor.execute('''
        BEGIN
            SET SQL_SAFE_UPDATES = 0;
            UPDATE ...;
            SET SQL_SAFE_UPDATES = 1;
        END
    ''')
    
  • 共有1个答案

    陶淳
    2023-03-14

    我知道这已经很长时间了,但也许今天你我都有同样的问题。我已经通过在关闭连接之前提交我的更改来解决了这个问题,只需在关闭连接“cnx.commit()”之前添加此内容,希望这能有所帮助

     类似资料:
    • 我只是想做一个简单的“教程”应用程序来获取我手机的位置(学习如何在其他应用程序中使用它),但我哪儿也没得到。 > Android Developer的教程:首先,我按照教程在Android的开发者站点(developer.android.com/training/location/receive-location-updates.html)。 正如这里所指出的,我使用了Location、Locat

    • 我痛苦了3天。我正在使用兼容性库中的视图分页程序。我已经成功地让它显示了几个视图。我的问题是,当我交换视图时,不会在它的回收器视图中按片段更新数据。但当我关闭应用程序时,打开碎片会按回收器视图显示更新内容。我使用了所有方法,如setnotifydatachanged()和许多其他方法,但viewpager中的片段不更新内容。感谢所有的帮助,这是我的主要活动

    • 我正在用一些初始数据绘制一个条形图,然后在单击按钮时尝试更新。我收到错误“未捕获的类型错误:无法读取未定义的属性'长度'”。单击更新后,将发生错误。如何解决此问题并启用更新功能以绘制新的条形图? D3代码:

    • 问题内容: 我正在尝试使用array 更新 ng-grid。我 这里 有个小伙伴。 添加按钮添加新行。更新按钮更新阵列中的最后一项。 选择一行并按更新按钮。没发生什么事。 按添加按钮。现在,UI将使用新元素&以及以前更新的元素进行更新。 相同的行为一次又一次地重复。 我试过了。我得到: “错误:$ apply已经在进行中” 我什至尝试通过将块放置在呼叫中来进行尝试。同样是同样的错误! 任何指针!

    • 编辑:我已经用一个带有PropertyValueFactory的cellValueFactory创建了和TableView,但是当我更新表示TableView数据的ObservableList时,我的TableView将不会更新。我确信readNctsvorgaenge()创建的新列表已经更新,并且包含了附加项。这是用mvvmfx->moodel view viewmodel实现的 这是FXML文

    • 问题内容: 这里的PLUNKR示例 我正在使用某种形式的jquery autocomplete作为angularjs direcitve。当jquery使用angular 更新输入的值时,直到下一个摘要(我想)之后才注意到更改。 我的第一个想法是使用来对后摘要执行操作,但是如您所见,它没有帮助。 我的第二种方法是重写该元素的功能以触发事件,但是我没有设法使其起作用。 尝试从自动完成列表中选择一个值