MySQL · 错误码速查
MySQL 错误 1146:先看报错里写的是哪个库,再查大小写和对象类型
ERROR 1146 (42S02): Table 'shop.orders' doesn't exist 表示语句在 shop 库里找不到 orders 表。报错里的库名是 MySQL 实际查找的库(没写库名时就是当前默认库),先确认它是不是你以为的那个库。Linux 上默认 lower_case_table_names=0,Orders 和 orders 是两张不同的表;迁移自 Windows/macOS 的 SQL 最常在这里报 1146。
官方原文
Error number: 1146; Symbol: ER_NO_SUCH_TABLE; SQLSTATE: 42S02
Message: Table '%s.%s' doesn't exist两个 %s 分别是库名和表名。DROP TABLE 不存在的表报的是 1051 ER_BAD_TABLE_ERROR(Unknown table),同属 SQLSTATE 42S02。
出处:MySQL 8.4 Error Reference:Server Error Message Reference 最后核对:
| 错误号 / 符号 | 1146 / ER_NO_SUCH_TABLE(服务端错误) | 出处 |
|---|---|---|
| SQLSTATE | 42S02(基表或视图未找到) | 出处 |
| lower_case_table_names 默认值 | Linux/Unix 0(区分大小写)、Windows 1、macOS 2;只能在初始化数据目录时设置,之后不能改 | 出处 |
| 同类但不同号 | DROP 不存在的表 → 1051;视图底表缺失 → 1356;表空间文件缺失 → 1812 | 出处 |
先看报错里的库名:它是 MySQL 实际去找的那个库
在 MySQL 8.4.10 测试库(自造数据)上,表 Orders 建在 err_lab2 库。连接切到 err_lab 后执行 SELECT * FROM Orders,报的是 Table 'err_lab.Orders' doesn't exist:库名是当前默认库 err_lab,不是表真正所在的库。连接池默认库配错、多租户按库分开、迁移脚本里漏了 USE,都会这样报。
另一个本机复现的坑:把 err_lab2.Orders 整体写进一对反引号(` err_lab2.Orders ),MySQL 把它当成一个名字叫 err_lab2.Orders 的表,报 Table 'err_lab2.err_lab2.Orders' doesn't exist。库名和表名要分别加反引号: err_lab2.Orders `。
SELECT DATABASE(), @@lower_case_table_names;
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE
FROM information_schema.TABLES
WHERE LOWER(TABLE_NAME) = LOWER('Orders')
ORDER BY TABLE_SCHEMA;本机这条查询返回了 err_lab.orders、err_lab2.Orders、upg_lab.orders 三行,能一眼看出「表在别的库」或「大小写不一致」。查询只返回当前账号有权限看到的表,没有权限的表在 information_schema 里也看不到。
大小写:Linux 上 Orders 和 orders 是两张表,而且建库后改不了
本机 @@lower_case_table_names = 0(Linux 默认):建的是 Orders,SELECT * FROM orders 报 Table 'err_lab2.orders' doesn't exist,SELECT * FROM Orders 正常。Windows 默认 1、macOS 默认 2,在那边开发时大小写写错不会报错,部署到 Linux 才报 1146。
| 做法 | 说明 |
|---|---|
| 统一 SQL 里的表名大小写 | 最稳妥。建表、ORM 映射、SQL 文件里用同一种写法(通常全小写) |
新实例初始化时设 lower_case_table_names=1 | 官方说明此值只能在初始化数据目录时配置,已有实例改配置会启动失败,不能当作临时修复 |
| 从 Windows 导出的 dump 导入 Linux | 先检查 dump 里的表名大小写和应用 SQL 是否一致,再导入 |
不要在已有数据的实例上改 lower_case_table_names 并重启。8.0 起这会被拒绝启动;要换值只能新建实例、重新导入数据。
表明明建过:临时表只在本会话可见,存储过程到调用时才检查
- 临时表:本机在一个会话里
CREATE TEMPORARY TABLE tmp_x,另开一个会话SELECT * FROM tmp_x,报Table 'err_lab2.tmp_x' doesn't exist。连接池把同一个业务流程分到不同连接、或者连接断开重连后,之前建的临时表都会「消失」。 - 存储过程:
CREATE PROCEDURE p_missing() SELECT * FROM not_there能建成功,CALL p_missing()时才报 1146。建过程不检查表是否存在,所以迁移后要实际调用一遍关键过程,不能只看建过程有没有报错。 - DDL:对不存在的表执行
ALTER TABLE … ADD COLUMN、TRUNCATE TABLE,本机都报 1146;DROP TABLE报的则是 1051Unknown table,DROP TABLE IF EXISTS只留一条 1051 Note。
像 1146 但不是:1356(视图)、1051(DROP)、1812(表空间)
| 现象 | 错误号(本机复现或官方) | 先查什么 |
|---|---|---|
| 查视图,底表被删或改名 | 1356 View '…' references invalid table(s) or column(s)…(本机复现) | SHOW CREATE VIEW,对照视图引用的表和列是否还在 |
| DROP 不存在的表 | 1051 Unknown table '…'(本机复现) | 确认库名;脚本里用 IF EXISTS |
| 表定义在、.ibd 文件丢了 | 1812 Tablespace is missing for table %s(官方原文) | 数据目录文件是否被单独拷走或删除;按备份恢复,不要手工拷 .ibd |
| 真的找不到表 | 1146 | 库名、大小写、临时表、权限可见性 |
区分这几种很重要:1356 说明视图定义需要改,1812 说明是存储层文件问题、要走恢复流程,只有 1146 才是名字或库的问题。
恢复、迁移之后报 1146:用一条查询对比清单
从 mysqldump 或其他备份恢复后应用报 1146,常见原因是只恢复了部分库或表、恢复到了另一个库名、或者 dump 里的表名大小写和应用不一致。先在源库和目标库各跑一遍下面的只读 SQL,导出结果对比,比逐条看报错快。
SELECT TABLE_NAME, TABLE_TYPE, ENGINE, TABLE_ROWS
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'your_db'
ORDER BY TABLE_NAME;TABLE_ROWS 对 InnoDB 是估算值,只用来看表在不在、数量级对不对;要核对数据量用 SELECT COUNT(*) 并选低峰执行。恢复演练的完整步骤见下方「mysqldump 恢复报错与 RTO 演练」。
常见问题
表明明存在,为什么报 1146 Table doesn't exist?
最常见的三个原因:当前默认库不是表所在的库(看报错里的库名);Linux 上表名大小写不一致(lower_case_table_names=0 时 Orders 和 orders 不同);表是别的会话建的临时表。
能不能把 lower_case_table_names 改成 1 解决大小写问题?
只能在初始化新实例时设置。官方说明初始化后禁止修改,已有实例改了会启动失败。现有实例应统一 SQL 里的表名大小写。
DROP TABLE 不存在的表为什么报 1051 而不是 1146?
DROP 用的是 1051 ER_BAD_TABLE_ERROR(Unknown table),两者 SQLSTATE 都是 42S02。脚本里用 DROP TABLE IF EXISTS,只会留下一条 1051 Note。
查视图报错是 1146 还是 1356?
本机 MySQL 8.4.10 复现:视图的底表被删后,查询视图报 1356(references invalid table(s)…),不是 1146。用 SHOW CREATE VIEW 查视图引用了哪些表。
下一步
价格以对应页面当前标价为准。
出处(最后核对 2026-11-04)
- MySQL 8.4 Error Reference:Server Error Message Reference
- MySQL 8.4 Reference Manual 11.2.3:Identifier Case Sensitivity
- MySQL 8.4 Reference Manual:Server System Variables(lower_case_table_names)
本页摘录并解读上面列出的官方文档,不是官方页面;官方文档更新后以官方为准。本页内容都来自官方文档,没有我们自己的测试结果。