SHOW CREATE TABLE 返回的是 MySQL 内部重写后的语句,非原始建表语句,会自动补全字符集、排序规则、引擎等,且跨版本存在兼容性问题。
SHOW CREATE TABLE 为什么返回的不是原始建表语句
它返回的是 mysql 内部重写后的语法,比如自动补全默认字符集、排序规则、存储引擎,甚至把
拆成
。你复制回去直接执行可能报错——尤其是跨版本迁移时,
值、分区定义、注释格式都可能不兼容。
MySQL 5.7 默认加
,但你原表可能没显式声明
MySQL 8.0+ 会把注释里的单引号转义成两个单引号,导致还原失败
如果表有全文索引或空间索引,
输出的语法在低版本上根本不能执行
怎么安全地导出可复用的建表语句
别只靠
,得配合实际需求做清理和适配:
用
更可靠,它会自动处理版本兼容项
若必须手改
结果:删掉末尾的
(除非你真要保留该值),检查
是否目标环境支持
遇到
字段或生成列,确认目标 MySQL 版本是否支持——5.7.8+ 才支持
,8.0.13+ 才支持函数索引
执行 SHOW CREATE TABLE 报错 ERROR 1142 (42000)
这是权限问题,不是语法错。用户缺少对表的
或更关键的
权限(即使只查结构,MySQL 也要求这个):
管理员需执行:
如果是视图,还必须有
;如果是系统表(如
),普通用户默认无权查看
注意:有些托管数据库(如阿里云 RDS)会禁用
对系统库的操作,换
查更稳妥
想批量导出多个表的建表语句怎么办
别一个个敲
,用脚本或工具组合更省事:
命令行快速生成(Linux/macOS):
注意
去字段名,
去表格格式,否则拼接会出错
导出后手动删掉每段开头的
重复行(因为
输出自带这行)
真正麻烦的是外键依赖顺序——
不保证按依赖关系排序,还原时得自己理清
的先后次序。
intint(11)auto_incrementENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ciSHOW CREATE TABLESHOW CREATE TABLEmysqldump --no-data --skip-triggers --skip-routines 数据库名 表名SHOW CREATE TABLEAUTO_INCREMENT=xxxCOLLATEJSONJSONSELECTSHOW VIEWGRANT SELECT, SHOW VIEW ON 数据库名.表名 TO '用户名'@'主机';SHOW VIEWmysql.userSHOW CREATE TABLEINFORMATION_SCHEMASHOW CREATE TABLEmysql -Nse "SELECT CONCAT('SHOW CREATE TABLE ', table_name, ';') FROM information_schema.tables WHERE table_schema='数据库名' AND table_type='BASE TABLE'" | mysql 数据库名 > create_statements.sql-N-sCREATE TABLE `表名`SHOW CREATE TABLESHOW CREATE TABLECREATE TABLE