应使用 sys.table_exists() 判断临时表存在性:mysql 5.7.9+ 中该函数返回 'temporary'、'base table'、'view' 或空字符串,准确区分对象类型,避免依赖不可靠的 information_schema 查询或错误尝试访问不存在的 tempdb。

直接查 information_schema.tables 会漏掉临时表
临时表(#xxx)不存于当前数据库的 information_schema.tables 中,而是在 tempdb 的元数据里——但 MySQL 没有 tempdb 这个库名,它的临时表元信息实际藏在 information_schema.tables 的 table_schema = 'information_schema' 且 table_type = 'TEMPORARY' 的记录里。不过这个视图在不同 MySQL 版本中行为不一致:5.7 默认不暴露临时表,8.0+ 才稳定支持。所以硬查这个视图不可靠,尤其在线上混合版本环境里容易误判为“不存在”。
用 sys.table_exists() 是最省心的方式
MySQL 5.7.9+ 自带的 sys 系统库提供了现成的存储过程 sys.table_exists(),它能准确区分永久表、视图和临时表。注意它返回的是类型字符串,不是布尔值:
-
@exists返回'TEMPORARY'表示当前会话存在同名临时表 - 返回
'BASE TABLE'是永久表,'VIEW'是视图,空字符串表示完全不存在 - 如果既有临时表又有同名永久表,
sys.table_exists()优先返回'TEMPORARY'
调用示例:
CALL sys.table_exists(DATABASE(), '#my_temp', @exists); SELECT @exists;
在存储过程中使用时,记得声明 @exists 变量并检查其值,别直接拿它当条件用(比如 IF @exists THEN),因为它是字符串。
手动查 tempdb 元数据?MySQL 根本没有 tempdb 库
很多 SQL Server 用户会下意识写 IF OBJECT_ID('tempdb..#xxx') IS NOT NULL,这在 MySQL 里会报错:Unknown database 'tempdb'。MySQL 不暴露 tempdb 作为可查询库,也不提供 OBJECT_ID() 函数。试图用 SELECT 1 FROM tempdb.INFORMATION_SCHEMA.TABLES WHERE table_name = '#xxx' 同样失败。这条路走不通,不用试。
为什么不能用 DROP TEMPORARY TABLE IF EXISTS #xxx 代替判断?
可以,而且推荐——只要你的目标只是“确保临时表干净再重建”,那根本不需要先判断。直接执行:
DROP TEMPORARY TABLE IF EXISTS #xxx; CREATE TEMPORARY TABLE #xxx (...);
但要注意两个坑:
-
DROP TEMPORARY TABLE只对当前会话有效,不会影响其他会话的同名临时表 - 如果临时表不存在,
DROP安静跳过;但如果语句里写成DROP TABLE IF EXISTS #xxx(漏了TEMPORARY),就会去删永久表,风险极大 - 某些旧版客户端(如早期 phpMyAdmin)在解析含
TEMPORARY的DROP时可能出兼容问题,建议统一用sys.table_exists()+ 显式逻辑控制
真正需要“判断”的场景,通常是想复用已有临时表结构、或根据是否存在做分支逻辑——这时候必须用 sys.table_exists(),而不是靠 DROP 的副作用来推断。











