开启sql_safe_updates时执行含子查询的UPDATE语句报错求助
解决MySQL安全更新模式下带IN子查询的UPDATE报错问题
错误原因
MySQL的sql_safe_updates安全模式会校验UPDATE/DELETE语句的WHERE子句:必须引用索引/主键列,且条件不能是全表匹配(比如WHERE 1=1)。当使用IN (子查询)的写法时,MySQL的安全模式检测逻辑可能无法识别EXTERNALCONNECTIONTYPEKEY是索引列,从而触发错误Error 1175 (HY000)。
可行解决方案(无需关闭安全模式)
方案1:改用JOIN关联写法
将子查询转换为JOIN操作,让MySQL明确识别到WHERE子句中使用了索引列:
UPDATE EXTERNALCONNECTIONTYPE ect JOIN ( SELECT DISTINCT EXTERNALCONNECTIONTYPE AS type_key FROM EXTERNALCONNECTION WHERE MSCONNECTORVERSION LIKE 'SFTPConnector/%' AND EXTERNALCONNECTIONKEY <> 0 ) ec ON ect.EXTERNALCONNECTIONTYPEKEY = ec.type_key SET ect.ATTRIBUTEDESCMAP = 'BlahBlahBlah', ect.ATTRIBUTEKEY = 'BlahBlah', ect.ENCRYPTEDATTRIBUTES = 'BlahBlah';
方案2:添加额外的索引列恒真条件
如果EXTERNALCONNECTIONTYPEKEY是自增主键或正整数列,可以在WHERE里额外加一个EXTERNALCONNECTIONTYPEKEY > 0的条件,让安全模式检测通过:
UPDATE EXTERNALCONNECTIONTYPE SET ATTRIBUTEDESCMAP = 'BlahBlahBlah', ATTRIBUTEKEY = 'BlahBlah', ENCRYPTEDATTRIBUTES = 'BlahBlah' WHERE EXTERNALCONNECTIONTYPEKEY > 0 AND EXTERNALCONNECTIONTYPEKEY IN ( SELECT DISTINCT EXTERNALCONNECTIONTYPE FROM EXTERNALCONNECTION WHERE MSCONNECTORVERSION LIKE 'SFTPConnector/%' AND EXTERNALCONNECTIONKEY <> 0 );
方案3:先将子查询结果存入临时表,再关联更新
先把需要更新的ID存入临时表,再用临时表关联原表更新:
-- 创建临时表存储目标ID CREATE TEMPORARY TABLE temp_conn_types SELECT DISTINCT EXTERNALCONNECTIONTYPE AS type_key FROM EXTERNALCONNECTION WHERE MSCONNECTORVERSION LIKE 'SFTPConnector/%' AND EXTERNALCONNECTIONKEY <> 0; -- 关联临时表更新 UPDATE EXTERNALCONNECTIONTYPE ect JOIN temp_conn_types t ON ect.EXTERNALCONNECTIONTYPEKEY = t.type_key SET ect.ATTRIBUTEDESCMAP = 'BlahBlahBlah', ect.ATTRIBUTEKEY = 'BlahBlah', ect.ENCRYPTEDATTRIBUTES = 'BlahBlah'; -- 可选:删除临时表 DROP TEMPORARY TABLE IF EXISTS temp_conn_types;
验证逻辑
以上三种方法都能让sql_safe_updates模式识别到WHERE子句使用了索引列EXTERNALCONNECTIONTYPEKEY,同时满足安全模式的校验要求,无需关闭安全模式即可执行更新。
内容的提问来源于stack exchange,提问作者Rashid Raza
相关产品推荐
相关产品推荐

