CREATE TABLE ... LIKE可精确复制表结构(含索引、列属性、主键、自增起始值、字符集等),但不复制数据、外键约束、触发器、分区、表注释及AUTO_INCREMENT当前值,需人工补全关键元信息。

MySQL中用CREATE TABLE ... LIKE创建结构一致的空表,确实可行,但要注意它只复制表结构(含索引、约束、列属性),不复制数据、触发器、分区定义、外键引用行为,也不复制注释(5.7+部分版本会保留列注释,但表注释丢失)
这是最接近“完全一样”的原生方式,但别指望它一键克隆出可直接上线替代的副本。实际使用前必须人工确认关键元信息是否满足需求。
CREATE TABLE new_table LIKE old_table的基本写法和权限要求
语句本身极简,但执行者需对源表有SELECT权限(MySQL 8.0+还要求SHOW VIEW权限,即使不是视图),且目标库要有CREATE权限。若跨库操作,需写全名:CREATE TABLE db2.new_table LIKE db1.old_table。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 目标表名不能已存在,否则报错
ERROR 1050 (42S01): Table 'xxx' already exists - 源表必须是基本表(
BASE TABLE),不能是视图或临时表 - 如果源表用了
ENGINE=InnoDB,新表默认也用InnoDB;但引擎类型本身不被显式继承,仅由当前会话默认引擎决定(可通过SET default_storage_engine=MyISAM临时切换)
哪些东西不会被LIKE复制?必须手动补全
这是最容易踩坑的地方——你以为结构一样了,结果上线后发现外键失效、查询变慢、字段描述丢失。
-
FOREIGN KEY约束:源表的外键定义不会出现在新表中(仅索引结构被复制) - 触发器(
TRIGGER):完全不复制,需单独用SHOW CREATE TRIGGER导出再重建 - 表注释(
COMMENT):MySQL 5.7 默认丢弃,8.0+ 仍不保证保留(实测多数情况丢失) - 自增初始值(
AUTO_INCREMENT):新表从1开始,不继承源表当前值(可用ALTER TABLE new_table AUTO_INCREMENT = N手动设) - 分区定义(
PARTITION BY):不复制,新表变成非分区表
想连注释、外键、触发器一起复制?得组合其他命令
纯LIKE做不到全覆盖,生产环境建议分两步走:先LIKE建骨架,再用SHOW CREATE TABLE提取完整建表语句,人工清理数据、替换表名、检查约束后执行。
- 查源表完整建表语句:
SHOW CREATE TABLE old_table\G(注意加\G让格式可读) - 把输出里的
CREATE TABLE `old_table`替换成CREATE TABLE `new_table`,删掉ENGINE=...之后的/*!...*/兼容性注释(除非明确需要) - 重点核对
CONSTRAINT块是否包含外键、COMMENT是否还在、AUTO_INCREMENT值是否要调整 - 触发器必须单独处理:
SHOW TRIGGERS LIKE 'old_table'→ 手动改名 →CREATE TRIGGER
LIKE建空表没问题,但只要涉及外键、注释、触发器,就别幻想一条命令搞定——这些元信息散落在不同系统表里,MySQL没提供原子化克隆接口。

















