SHOW CREATE TABLE 是获取完整建表语句最准确方式,包含字段类型、索引、引擎、字符集等全部定义;需注意权限、版本兼容性及特殊字符转义。

直接用 SHOW CREATE TABLE 就能拿到完整建表语句
这是最准、最全、最省事的方式——它不是“描述结构”,而是原样还原你(或别人)当初执行的 CREATE TABLE 语句,包括字段类型、DEFAULT、AUTO_INCREMENT、索引定义、ENGINE、CHARSET、COLLATE,甚至分区和注释。只要权限够,一查就出结果。
实操建议:
- 当前库下查:直接运行
SHOW CREATE TABLE user_info; - 跨库查更安全:显式写上库名,比如
SHOW CREATE TABLE myapp.users;,避免因默认库切换导致查错表 - 表名含特殊字符或关键字时,务必用反引号包裹:
SHOW CREATE TABLE `order`;,否则报语法错误 - 加
\G结尾能让长语句竖排显示,方便阅读:SHOW CREATE TABLE logs\G
SHOW CREATE TABLE 返回的 Create Table 字段里藏着几个关键细节
返回结果有两列:Table 和 Create Table。后者才是重点,但里面有些值容易被误解:
-
AUTO_INCREMENT=1001表示“下一个插入会用 1001”,不是当前最大 ID;想看真实最大值得查SELECT MAX(id) FROM table_name; -
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP这类函数默认值,在旧版 MySQL(如 5.6)可能无法直接拿去建新表,会报错,需手动改成字面量或确认目标版本兼容性 - 如果表用了分区,语句里会完整写出
PARTITION BY RANGE等定义;但注意:MySQL 不支持对子分区单独执行SHOW CREATE TABLE,只能查整张表 - 字符集显示为
utf8mb4_0900_ai_ci是 MySQL 8.0+ 默认排序规则,若迁移到老版本,可能得降级成utf8mb4_unicode_ci
别只依赖 DESC 或 SHOW COLUMNS 查定义
它们快、轻量,但信息严重不全——适合快速扫一眼字段名和类型,不适合理解真实建表逻辑。
-
DESC user_info;或DESCRIBE user_info;:只显示字段名、类型、是否NULL、键类型(PRI/MUL)、默认值,**不显示索引名、不显示联合索引顺序、不显示外键、不显示表选项** -
SHOW FULL COLUMNS FROM user_info;:比DESC多一个Extra列(比如auto_increment),还能看到字段注释(Comment),但仍**不包含任何索引或引擎信息** - 真要对比结构差异、做 DDL 迁移、排查同步异常,
SHOW CREATE TABLE是唯一可靠来源;其他命令只是临时辅助
权限和兼容性问题常被忽略
看似一条简单命令,但在生产环境经常卡在权限或版本上:
- 用户必须有该表的
SELECT权限(MySQL 8.0+ 还接受SHOW VIEW),仅USAGE或连接权限不够,会报ERROR 1142 (42000): SELECT command denied to user - 从
information_schema.TABLES查CREATE_TABLE字段虽可行,但字段类型是longtext,极长语句可能被截断(尤其带大量注释或分区时),不如原生命令稳 - 某些云数据库(如腾讯云 CDB、阿里云 RDS)默认关闭
information_schema的部分访问,或限制SHOW CREATE TABLE对系统表的使用,查前先确认管控策略
真正麻烦的从来不是语法,而是你查出来的语句,复制到另一套环境里跑不通——不是少了个分号,而是字符集、排序规则、时间戳默认行为、甚至 SQL mode 差了一点点。











