CREATE TABLE ... LIKE 仅复制表结构,包括列定义、默认值、NULL约束、字符集、排序规则及主键/唯一键/普通索引(不复制约束名),但不复制数据、外键、触发器、注释、AUTO_INCREMENT值、分区定义等。
CREATE TABLE ... LIKE 会复制哪些东西
它只复制表结构,不复制数据、不复制索引以外的其他对象(比如触发器、外键约束、注释、AUTO_INCREMENT 值),也不复制分区定义(MySQL 8.0+ 对分区支持有限)。最关键的是:
不会继承
和
的自增属性——新表的
值默认为 1,哪怕原表是 10000。
复制:列定义、默认值(
)、NULL/NOT NULL、字符集、排序规则、主键/唯一键/普通索引(但不复制约束名)
不复制:外键约束(
)、触发器、存储过程关联、表注释(
)、行格式(
)、压缩设置、
当前值
注意:
在 MySQL 5.7 中不复制
索引;8.0+ 支持,但要求源表和目标表引擎一致(比如都是
)
为什么 CREATE TABLE ... LIKE 复制后插入失败
常见于带
列但没设默认值的场景。原表可能靠应用层或触发器补值,而新表没这些逻辑,直接
就会报
。
检查新表字段是否全有默认值或允许 NULL:
如果原表有生成列(
),
会复制,但 MySQL 5.7 不支持在
中直接引用它,需显式列出字段
字符集不一致也可能导致隐式转换失败,特别是从
复制到旧版本默认
表时
想连数据一起复制?别只用 LIKE
本身不带数据,硬要“快速复制表”必须组合其他操作。最常用且安全的做法是两步:建结构 + 导数据。
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
先建空表:
再灌数据:
如果要保留
值,得手动改:
大表慎用
:没加
条件容易锁表或 OOM;建议分批或用
配合
替代方案:CREATE TABLE AS SELECT(CTAS)的坑
看似更“一步到位”,但它只复制列定义和数据,**完全不复制索引、主键、约束、默认值、字符集(用连接默认值)** —— 这和
是本质区别。
结果表所有字段都变成
允许,哪怕原表是
主键和索引全丢,后续查起来慢,还可能引发唯一性问题
如果原表有
或
,CTAS 可能转成
,类型失真
真正需要“结构+数据”且不想写两行语句?老实用
(结构)和
(数据)拆开导,或 Percona Toolkit 的
最常被忽略的是:不同 MySQL 版本对
的实现有细微差异,比如 5.6 不复制
约束,8.0.16+ 才开始支持;线上迁移前务必在同版本环境验证索引是否真的建上了。
LIKEPRIMARY KEYUNIQUE KEYAUTO_INCREMENTDEFAULTFOREIGN KEYCOMMENTROW_FORMATAUTO_INCREMENTLIKEFULLTEXTInnoDBNOT NULLINSERT INTO new_table SELECT * FROM old_tableField 'xxx' doesn't have a default valueSHOW COLUMNS FROM new_tableGENERATED COLUMNLIKESELECT *utf8mb4utf8CREATE TABLE ... LIKECREATE TABLE new_table LIKE old_tableINSERT INTO new_table SELECT * FROM old_tableAUTO_INCREMENTALTER TABLE new_table AUTO_INCREMENT = (SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'db_name' AND TABLE_NAME = 'old_table')SELECT *WHEREmysqldump --no-create-info--skip-triggersCREATE TABLE new_table AS SELECT * FROM old_tableLIKENULLNOT NULLENUMSETVARCHARmysqldump -d-tpt-archiverLIKECHECK