show create table table_name; 可获取含字段、索引、字符集、引擎等完整建表语句;需注意库切换、表名大小写及特殊字符用反引号;相比desc,它还包含注释、外键、联合索引等全部定义。

怎么用 SHOW CREATE TABLE 看表结构
直接执行 SHOW CREATE TABLE table_name; 就能拿到建表语句,包括字段、索引、字符集、存储引擎等全部定义。注意表名要写对,大小写敏感取决于系统配置(Linux 下通常敏感,Windows 不敏感)。
常见错误现象:ERROR 1146 (42S02): Table 'db.table_name' doesn't exist —— 多半是表名拼错,或没先 USE db_name; 切换库。
- 必须在目标数据库下执行,或写全名:
SHOW CREATE TABLE mydb.users; - 如果表名含特殊字符(比如中划线),要用反引号:
SHOW CREATE TABLE `my-table`; - 结果只返回一行记录,
Create Table字段里就是完整 DDL,别误以为是多行输出
SHOW CREATE TABLE 和 DESCRIBE 有什么区别
DESCRIBE table_name(或简写 DESC)只列字段名、类型、是否为空、键类型、默认值和额外信息,不带索引定义、外键、注释、字符集、引擎这些。它适合快速扫一眼字段,但没法还原建表逻辑。
使用场景:调试时查字段类型用 DESC 更快;迁移、备份、复现表结构必须用 SHOW CREATE TABLE。
-
DESC不显示COMMENT,而SHOW CREATE TABLE会保留字段和表级注释 -
DESC看不到联合索引的完整定义(比如KEY idx_a_b (a,b)),SHOW CREATE TABLE会原样写出 - 某些版本 MySQL 中,
DESC对生成列(generated column)显示不全,SHOW CREATE TABLE才准确
导出建表语句时容易漏掉的细节
拿到 SHOW CREATE TABLE 输出后直接复制执行,有时会失败——不是语法问题,而是隐含依赖没处理好。
典型坑点:
- 字符集和排序规则可能被省略,默认继承库级设置,但跨库迁移时容易不一致,建议显式写出:
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci - 如果表有外键,
SHOW CREATE TABLE会包含CONSTRAINT子句,但目标库若未开启FOREIGN_KEY_CHECKS,或引用的父表不存在,建表会报错 - 分区表、全文索引、JSON 类型字段等高级特性,在低版本 MySQL 上不兼容,复制前得确认目标环境支持
想批量导出多个表的建表语句怎么办
MySQL 命令行本身不支持通配符批量查,得靠组合命令或脚本。
简单实操建议:
- 用
SELECT GROUP_CONCAT(...)拼接 SQL(适合少量表):SELECT GROUP_CONCAT(CONCAT('SHOW CREATE TABLE ', table_name, ';') SEPARATOR ' ') FROM information_schema.tables WHERE table_schema='mydb' AND table_name IN ('users','orders'); - 更稳妥的做法是用
mysqldump -d(-d 表示 no-data):mysqldump -u root -p -d mydb users orders,它本质也是调SHOW CREATE TABLE,但自动处理了转义、兼容性和顺序 - 注意:
mysqldump默认加CREATE DATABASE IF NOT EXISTS和USE,不需要的话加--skip-dump-date --no-create-db --skip-add-drop-table
真正麻烦的不是命令怎么敲,而是建表语句里那些没显式声明却实际生效的默认值——比如 TIMESTAMP 字段的自动初始化行为、sql_mode 对严格模式的影响,这些不会出现在 SHOW CREATE TABLE 输出里,但会决定插入数据时的实际表现。











