用心打造
VPS知识分享网站

MySQL报ERROR 1137,临时表换了别名为何仍不能自连接?

本文于 2026-11-10 08:08 更新,部分内容具有时效性,如有失效,请留言

查询里的两个别名看起来不一样,执行却提示ERROR 1137: Can't reopen table。这在同一条SQL两次引用显式临时表时就可能出现,改别名并不会创建新的表对象。

两张表格之间的连接断开,表示临时表重复引用受限

先确认错误指向哪张表

沿连接池中的同一物理会话查看前置SQL,确认该对象是否由CREATE TEMPORARY TABLE创建。两个别名仍引用同一个临时表。临时表还可能遮住同名普通表,换一个会话直接查询容易得出不同结论。

一条语句能完成时优先考虑CTE

在支持CTE的MySQL 8.0及后续版本,可把构造临时结果的查询放进WITH src AS (SELECT id, group_id FROM items WHERE enabled = 1),随后使用SELECT a.id, b.id FROM src AS a JOIN src AS b ON a.group_id = b.group_id AND a.id < b.id;。表名、列名和配对条件都要按业务替换。

CTE的作用域只有本条语句。若原临时表在多条SQL间还发生更新,不能直接把所有用途机械替换成CTE。

旧版本或跨语句流程怎么改

MySQL 5.7没有CTE语法。需要在同一语句读取同一份中间数据两次时,可用CREATE TEMPORARY TABLE tmp_items_copy LIKE tmp_items;和INSERT INTO tmp_items_copy SELECT * FROM tmp_items;复制一份,再分别引用两个表。先测量额外空间和建表时间。列定义含特殊字段时应使用明确的插入列清单。

存储函数和连接池的额外边界

官方手册还指出,在存储函数内用不同别名多次引用同一临时表,也可能跨语句触发该错误。连接池场景应明确中间表的创建、使用和清理都在同一物理连接。清理用DROP TEMPORARY TABLE IF EXISTS tmp_items_copy;,避免误删同名普通表。

如何核对改写前后的语义

在萤光云或LightNode的同版本VPS上用包含重复键、空值和无匹配行的测试数据,核对行数、连接结果、执行计划和空间占用。验收不止是1137消失,还要确认查询没有遗漏或重复配对。

FAQ

换成另外两个别名行不行? 不行,限制针对表对象。

重启MySQL能修好吗? 不能改变SQL对临时表的引用规则。

CTE一定比临时表快吗? 不一定,对实际数据看执行计划和耗时。

别的会话能看见我的临时表吗? 显式临时表仅当前会话可见。

能直接换成永久中间表吗? 需要另外设计并发隔离、清理和权限,不能作为无成本替代。

温馨提示

迁移改写前保留原查询和预期结果,先从只读版本验证等价性;不要在生产池留下命名固定、无人清理的临时表。

赞(0)
未经允许不得转载;国外VPS测评网 » MySQL报ERROR 1137,临时表换了别名为何仍不能自连接?
分享到