MySQL中如何在CTE内引用被LOCK TABLES语句锁定的表
报错原因
MySQL 显式LOCK TABLES机制要求:执行锁表操作后,后续所有查询中涉及的原表名、自定义表别名、CTE名称都必须在锁表语句中提前声明对应的锁权限,否则就会抛出1100错误。
你当前的查询通过CTE定义了别名tmp,且后续主查询和子查询两次引用了该别名,但锁表时仅声明了原表order_bd的写锁,未覆盖用到的CTE别名,因此触发报错。
解决方案
- 方案1:修改锁表语句,补充CTE别名的锁声明
锁表时执行如下语句即可,后续原CTE查询可正常运行:
lock tables order_bd write, tmp write;
注意操作完成后及时执行unlock tables;释放锁,避免阻塞其他会话访问相关表。
- 方案2:改写SQL避免多次引用CTE别名(无需修改锁表语句)
使用窗口函数替代子查询的二次扫描,整个查询仅访问一次order_bd,不需要额外声明CTE别名的锁,改写后的SQL如下:
SELECT * FROM ( SELECT *, MIN(DATAKB) OVER() AS min_datakb FROM order_bd WHERE DATANO = '20277207' AND RECNO = '641605567' ) t WHERE DATAKB = min_datakb;
内容的提问来源于stack exchange,提问作者Nguyễn Nam
相关产品推荐
相关产品推荐

