desc 命令最轻量,仅显示列名、类型、是否允许null;show create table 提供完整建表语句与约束;information_schema.columns 支持跨表批量查询结构信息。

desc 命令能直接看到列名、类型、是否为空这些基础信息
它是最轻量的查表结构方式,适合快速确认字段是否存在、类型是不是 VARCHAR(255) 或 INT 这类基本事实。不查索引、不查默认值表达式、不显示外键约束,只聚焦列定义本身。
执行很简单:
DESCRIBE users;或简写为
DESC users;。注意表名要带数据库名前缀(如
mydb.users)才能跨库查,否则只在当前库生效。
- 如果报错
ERROR 1146 (42S02): Table 'xxx' doesn't exist,先确认当前库是否正确,用SELECT DATABASE();看一眼 -
DESC不区分大小写,但表名在 Linux 系统下是大小写敏感的,users和Users可能不是同一张表 - 结果里
Null列显示YES/NO,别误读成“该列值是否为 NULL”,它只是表示是否允许插入NULL
show create table 比 desc 多出建表语句和完整约束细节
当你需要复制建表语句、排查默认值异常或确认字符集时,SHOW CREATE TABLE users; 是唯一靠谱的选择。它输出的是可执行的 SQL,包含所有 ENGINE、CHARSET、COLLATE、COMMENT 和索引定义。
常见坑点:
- 输出结果会被截断——特别是字段多或注释长的表,MySQL 客户端默认限制显示宽度,加
\G尾缀可竖排查看:SHOW CREATE TABLE users\G
-
DEFAULT值显示可能和你预期不符:比如TIMESTAMP字段没显式设默认值,也会显示DEFAULT CURRENT_TIMESTAMP,这是 MySQL 5.6+ 的隐式行为 - 外键约束名(
CONSTRAINT `fk_user_profile`)在DESC里完全看不到,必须靠这个命令
information_schema.columns 是唯一能批量查多张表结构的方案
当你要遍历所有表找某个字段(比如查所有含 updated_at 的表),或者导出某库全部列的类型清单,INFORMATION_SCHEMA.COLUMNS 是绕不开的入口。
典型查询:
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'mydb' AND TABLE_NAME = 'users';
- 注意
TABLE_SCHEMA必须写对,它不是当前库名变量,而是字符串字面量,漏引号会报错 -
COLUMN_DEFAULT对于函数默认值(如CURRENT_TIMESTAMP)返回的是表达式字符串,不是计算后的值 - 性能上,大库(几百张表)查
INFORMATION_SCHEMA可能明显变慢,因为它本质是访问内部元数据表,不是缓存结果
desc 在视图上会报错,show create table 才是查视图结构的正解
对视图执行 DESC view_name; 会直接报 ERROR 1356 (HY000): View 'xxx' references invalid table(s) or column(s) 或类似错误,哪怕视图本身可用。这不是权限问题,是 MySQL 对视图元数据的限制。
查视图结构只能用:
SHOW CREATE VIEW view_name;
- 输出里
CREATE VIEW后紧跟的是原始SELECT语句,字段别名、函数调用、JOIN 关系全在里面 - 如果视图依赖的表被删了,
SHOW CREATE VIEW仍能成功执行,但内容可能已失效;而DESC会直接失败 - 想确认视图字段类型?得看
SELECT子句中对应表达式的推导结果,MySQL 不单独存视图列类型
DESC,要建表语句或约束就切到 SHOW CREATE,要跨表扫描就得进 INFORMATION_SCHEMA。三者不是替代关系,是不同粒度的工具。











