MySQL 5.7中子查询关联失败问题求助
解决MySQL 5.7跨数据库UPDATE子查询报错方案
你遇到的问题确实是MySQL 5.7对子查询中JOIN的ON子句引用外层更新表列的限制更严格导致的。结合你需要支持多数据库的需求,推荐以下两种改写方案:
方案一:隐式JOIN替代显式JOIN(跨数据库友好)
把原显式JOIN的ON条件移到WHERE子句中,避免在ON里引用外层表s的列,这种写法在MySQL 5.7和PostgreSQL中都能正常运行:
UPDATE sandboxes s SET permission_id = ( SELECT p.id FROM permissions p, tables t WHERE t.id = s.table_id AND p.object LIKE CONCAT('/db/', t.db_id, '/schema/', t.schema, '/table/', s.table_id, '/query/segmented/') AND p.group_id = s.group_id LIMIT 1 ) WHERE permission_id IS NULL;
方案二:MySQL专属UPDATE JOIN(性能更优,适配MySQL场景)
如果需要针对MySQL 5.7及以上版本做性能优化,可以使用原生UPDATE JOIN语法,执行效率比子查询更高:
UPDATE sandboxes s JOIN tables t ON t.id = s.table_id JOIN permissions p ON p.object LIKE CONCAT('/db/', t.db_id, '/schema/', t.schema, '/table/', s.table_id, '/query/segmented/') AND p.group_id = s.group_id SET s.permission_id = p.id WHERE s.permission_id IS NULL;
注:该写法为MySQL专属,PostgreSQL不支持,若需跨库兼容优先选择方案一。
内容的提问来源于stack exchange,提问作者noahmoss
相关产品推荐
相关产品推荐

