首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用SQL_SAFE_UPDATES更新表

不使用SQL_SAFE_UPDATES更新表
EN

Stack Overflow用户
提问于 2020-05-29 18:29:37
回答 1查看 785关注 0票数 1

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

代码语言:javascript
复制
        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。您正在使用安全更新模式,并且尝试更新一个表,但没有使用键列禁用安全模式的位置,在Preferences -> SQL中切换该选项并重新连接。

我在最后一个WHERE中使用表键,c1.idcustomers表键。使用SET SQL_SAFE_UPDATES = 0;不是一种选择。我也尝试使用WHERE c1.id > 0,但没有结果。

请注意,我尝试手动运行查询,更改SET SQL_SAFE_UPDATES = 0;,它正在按预期的方式工作,但这应该是一个自动的过程。

所以我的选择是:

  1. 使用单个查询,SQL_SAFE_UPDATES不能使用。
  2. 使用

游标,SQL_SAFE_UPDATES可以使用。(参见旁注)

  1. 在这里插入一个选项
  2. (我不想这样做)遍历每个记录(使用Python )并更新记录。这太愚蠢了,而且要花上一辈子。--

更新

也曾尝试过:

使用相同ID的

更新..。其中c1.id = c1.id;

  • 在每个子查询之后添加了一个很大的限制(如@

  • 所建议的):

将客户更新为c1内部连接(选择id,DATEDIFF(NOW(),agg.cdt)作为客户内部连接(选择c.id作为cid,最大(o.datetime)作为cdt,c从客户中选择左连接订单o ON o.customer_id = c.id,其中o.state = 20 GROUP BY c.id LIMIT 100000000 )作为agg ON customers.id = agg.cid WHERE account_type IN (1,( 2)删除=0和(account_management_state IN (0,1,2)或account_management_state为空)限制为c2在c1.id = c2.id上设置c1.account_management_state =当c2.acdt <= 90,当c2.acdt <= 90时为0,当c2.acdt >= 91和c2.acdt <= 360为1,当c2.acdt > 360或c2.acdt为空,则当c1.id = c2.id;

  • 是两个ID的组合:

更新..。其中c1.id >0和c2.id > 0;

他们都不起作用。还在拿Error Code: 1175

旁注

这是使用MySQL python和游标的Python/Flask进程的一部分。只要从Python游标中完成,我就可以使用SQL_SAFE_UPDATES。这是行不通的:

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

连接= db.get_conn()游标= connection.cursor() cursor.execute('SET SQL_SAFE_UPDATES =0‘)cursor.execute(查询)#来自原始查询cursor.execute('SET SQL_SAFE_UPDATES =1;’)

  • ,使用单个查询(不引发错误,它将不会更新任何内容):

connection = db.get_conn()游标= connection.cursor() cursor.execute(‘SET SQL_SAFE_UPDATES = 0;UPDATE .;SET SQL_SAFE_UPDATES = 1;’)

  • 使用BEGIN .. END (以为我看到了光,但没有),得到了ProgrammingError

连接= db.get_conn()游标= connection.cursor() cursor.execute(‘开始设置SQL_SAFE_UPDATES = 0;UPDATE .;SQL_SAFE_UPDATES = 1;END’)

EN

回答 1

Stack Overflow用户

发布于 2021-04-26 12:16:32

我知道这是很久以前的事了,但今天可能和你我的问题一样。我已经通过在关闭连接之前提交更改来解决这个问题,只需在关闭连接"cnx.commit()“之前添加它,希望这会有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62092508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档