CREATE TABLE ... LIKE 只复制结构,包括列定义、索引、AUTO_INCREMENT值、字符集和COLLATE,但不复制数据、外键、触发器、表注释、分区及部分存储引擎参数。

CREATE TABLE ... LIKE 能复制哪些内容
CREATE TABLE ... LIKE 只复制源表的结构,包括列定义、索引(含主键、唯一键、普通索引)、自增起始值(AUTO_INCREMENT)、字符集和排序规则(COLLATE),但不复制:数据、外键约束、触发器、注释(部分 MySQL 版本会保留列注释,但表注释一定丢失)、分区定义、存储引擎参数(如 ROW_FORMAT 有时会被忽略)。
为什么新表没继承外键或 COMMENT
MySQL 明确规定 LIKE 不复制外键和表级 COMMENT。即使源表有 FOREIGN KEY,目标表只会保留对应列和索引,不会生成 CONSTRAINT 定义;同理,SHOW CREATE TABLE 查看新表时,表注释为空。若需保留外键,必须手动补上 ALTER TABLE ... ADD CONSTRAINT;若需注释,得用 ALTER TABLE ... COMMENT = 'xxx' 单独加。
复制结构 + 数据的替代方案
如果实际需要的是“结构+数据”,LIKE 不够用,应分两步操作:
- 用
CREATE TABLE t2 LIKE t1建空表 - 再执行
INSERT INTO t2 SELECT * FROM t1
注意:这两步必须保证列顺序、类型、是否允许 NULL 完全一致;若源表有生成列(generated column)或虚拟列,部分旧版本 MySQL(如 5.7)可能报错,建议先检查 SHOW COLUMNS FROM t1 确认兼容性。
更安全的跨库/跨版本结构复制方式
当涉及不同数据库或 MySQL 版本升级时,LIKE 可能因默认存储引擎变更(如从 MyISAM 到 InnoDB)、字符集隐式转换等问题导致行为偏差。此时推荐用 mysqldump --no-data 导出结构:
mysqldump -u user -p --no-data db_name table_name > struct.sql
然后修改 struct.sql 中的表名和库名,再导入。这种方式显式可控,能避开 LIKE 对某些元数据(如 STATS_PERSISTENT、ALGORITHM)的忽略问题。
真正容易被忽略的是索引顺序和隐藏列——LIKE 复制的索引顺序与源表完全一致,但如果你后续在新表上执行 ALTER TABLE ... DROP INDEX 再重建,顺序就变了;另外,MySQL 8.0+ 的隐藏主键(如由 innodb_force_primary_key 引入)也不会被 LIKE 复制,得靠 SHOW CREATE TABLE 对比确认。










