在不使用sql\u safe\u更新的情况下更新表

krugob8w  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(279)

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

  1. UPDATE customers AS c1
  2. INNER JOIN (
  3. SELECT id, DATEDIFF(NOW(), agg.cdt) AS acdt
  4. FROM customers
  5. INNER JOIN
  6. (
  7. SELECT c.id AS cid, max(o.datetime) as cdt
  8. FROM customers AS c
  9. LEFT JOIN orders o ON o.customer_id = c.id
  10. WHERE o.state = 20
  11. GROUP BY c.id
  12. ) AS agg ON customers.id = agg.cid
  13. WHERE account_type IN (1, 2)
  14. AND deleted = 0
  15. AND (account_management_state IN (0, 1, 2) OR account_management_state IS NULL)
  16. ) AS c2 ON c1.id = c2.id
  17. SET c1.account_management_state = CASE
  18. WHEN c2.acdt <= 90 THEN 0
  19. WHEN c2.acdt >= 91 AND c2.acdt <= 360 THEN 1
  20. WHEN c2.acdt > 360 OR c2.acdt IS NULL THEN 2
  21. END
  22. WHERE c1.id = c2.id;

但我得到了:
错误代码:1175。您使用的是安全更新模式,并且您试图更新一个不带where的表,该表使用键列禁用安全模式,请在“首选项”->“sql编辑器”中切换该选项,然后重新连接。
我在决赛中用表键 WHERE , c1.idcustomers 表键。使用 SET SQL_SAFE_UPDATES = 0; 不是一个选择。我也试过用 WHERE c1.id > 0 无济于事。
请注意,我尝试手动运行查询 SET SQL_SAFE_UPDATES = 0; ,该查询按预期工作,但这应该是一个自动过程。
所以我的选择是:
使用单个查询, SQL_SAFE_UPDATES 不能使用。
使用python光标, SQL_SAFE_UPDATES 可以使用(见旁注)
[在此插入选项]
(我不想这样做)迭代每个记录(使用python orm)并更新记录。这太愚蠢了,要花很长时间。

更新

也尝试过:
使用相同的id

  1. UPDATE
  2. ...
  3. WHERE c1.id = c1.id ;

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

  1. UPDATE customers AS c1
  2. INNER JOIN (
  3. SELECT id, DATEDIFF(NOW(), agg.cdt) AS acdt
  4. FROM customers
  5. INNER JOIN
  6. (
  7. SELECT c.id AS cid, max(o.datetime) as cdt
  8. FROM customers AS c
  9. LEFT JOIN orders o ON o.customer_id = c.id
  10. WHERE o.state = 20
  11. GROUP BY c.id
  12. LIMIT 100000000
  13. ) AS agg ON customers.id = agg.cid
  14. WHERE account_type IN (1, 2)
  15. AND deleted = 0
  16. AND (account_management_state IN (0, 1, 2) OR account_management_state IS NULL)
  17. LIMIT 100000000
  18. ) AS c2 ON c1.id = c2.id
  19. SET c1.account_management_state = CASE
  20. WHEN c2.acdt <= 90 THEN 0
  21. WHEN c2.acdt >= 91 AND c2.acdt <= 360 THEN 1
  22. WHEN c2.acdt > 360 OR c2.acdt IS NULL THEN 2
  23. END
  24. WHERE c1.id = c2.id;

两个ID的组合:

  1. UPDATE
  2. ...
  3. WHERE c1.id > 0 and c2.id > 0;

他们都不工作。还在继续 Error Code: 1175 .

旁注

这是使用mysql python客户端和游标的python/flask进程的一部分。我可以用 SQL_SAFE_UPDATES 只要它是从python游标完成的。这不起作用:
使用不同的查询(不抛出错误,只是不会更新任何内容):

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

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

  1. connection = db.get_conn()
  2. cursor = connection.cursor()
  3. cursor.execute('''
  4. SET SQL_SAFE_UPDATES = 0;
  5. UPDATE ...;
  6. SET SQL_SAFE_UPDATES = 1;
  7. ''')

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

  1. connection = db.get_conn()
  2. cursor = connection.cursor()
  3. cursor.execute('''
  4. BEGIN
  5. SET SQL_SAFE_UPDATES = 0;
  6. UPDATE ...;
  7. SET SQL_SAFE_UPDATES = 1;
  8. END
  9. ''')
xqkwcwgp

xqkwcwgp1#

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

相关问题