我正在尝试使用此查询更新一些记录,这基本上只是一种为客户设置“状态”的方法,考虑到他们的“自上次订单以来的天数”:
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。您使用的是安全更新模式,并且您试图更新一个不带where的表,该表使用键列禁用安全模式,请在“首选项”->“sql编辑器”中切换该选项,然后重新连接。
我在决赛中用表键 WHERE
, c1.id
是 customers
表键。使用 SET SQL_SAFE_UPDATES = 0;
不是一个选择。我也试过用 WHERE c1.id > 0
无济于事。
请注意,我尝试手动运行查询 SET SQL_SAFE_UPDATES = 0;
,该查询按预期工作,但这应该是一个自动过程。
所以我的选择是:
使用单个查询, SQL_SAFE_UPDATES
不能使用。
使用python光标, SQL_SAFE_UPDATES
可以使用(见旁注)
[在此插入选项]
(我不想这样做)迭代每个记录(使用python orm)并更新记录。这太愚蠢了,要花很长时间。
更新
也尝试过:
使用相同的id
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;
他们都不工作。还在继续 Error Code: 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;
''')
使用 BEGIN .. END
(以为我看到了光,但没有),得到了一个 ProgrammingError
:
connection = db.get_conn()
cursor = connection.cursor()
cursor.execute('''
BEGIN
SET SQL_SAFE_UPDATES = 0;
UPDATE ...;
SET SQL_SAFE_UPDATES = 1;
END
''')
1条答案
按热度按时间xqkwcwgp1#
我知道已经很久了,但也许今天和你我的问题一样。我已经通过在关闭连接之前提交我的更改来解决了这个问题,只需在关闭连接之前添加这个“cnx.commit()”,希望这能有所帮助