我试图使用此查询更新一些记录,这基本上只是一种向客户设置“状态”的方式,考虑到他们“自上次订购以来的日子”:
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.id是customers表键。使用SET SQL_SAFE_UPDATES = 0;不是一种选择。我也尝试使用WHERE c1.id > 0,但没有结果。
请注意,我尝试手动运行查询,更改SET SQL_SAFE_UPDATES = 0;,它正在按预期的方式工作,但这应该是一个自动的过程。
所以我的选择是:
SQL_SAFE_UPDATES不能使用。游标,SQL_SAFE_UPDATES可以使用。(参见旁注)
更新
也曾尝试过:
使用相同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;
更新..。其中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’)
发布于 2021-04-26 12:16:32
我知道这是很久以前的事了,但今天可能和你我的问题一样。我已经通过在关闭连接之前提交更改来解决这个问题,只需在关闭连接"cnx.commit()“之前添加它,希望这会有所帮助。
https://stackoverflow.com/questions/62092508
复制相似问题