create table ... like 能完整复制列定义、索引、主键、auto_increment 值、字符集和 collate,但不复制数据、外键、表注释、触发器、分区及默认函数;而 create table ... as select 仅保留字段名和基础类型,丢失所有约束与元数据。

CREATE TABLE ... LIKE 是最直接的方式,能完整复制列定义、索引、主键、AUTO_INCREMENT 值、字符集和 COLLATE,但不带数据——这是你要的,不是“差不多”,就是它。
为什么不能用 CREATE TABLE ... AS SELECT * FROM ... LIMIT 0
这会丢掉几乎所有结构元信息:
-
PRIMARY KEY、UNIQUE、普通索引全部丢失 -
NOT NULL约束可能被忽略(取决于 MySQL 版本和 strict mode) -
AUTO_INCREMENT起始值不会继承 - 生成列(generated column)、虚拟列、全文索引等大概率失效或报错
它只保留字段名和基础类型,本质是“猜结构”,不是复制结构。
CREATE TABLE ... LIKE 的实际限制清单
它确实快,但以下内容明确不复制,必须手动补:
- 外键约束:新表只有对应列和索引,
FOREIGN KEY定义完全消失;需用SHOW CREATE TABLE查原语句,再执行ALTER TABLE ... ADD CONSTRAINT - 表注释(
COMMENT):一定丢失;列注释在部分版本中保留,但不可依赖 - 触发器、存储过程、函数默认值(如
DEFAULT CURRENT_TIMESTAMP可能变成字面字符串) - 分区定义(MySQL 8.0+ 支持复制分区,但旧版本不支持)
- 隐藏主键(如由
innodb_force_primary_key引入的隐式主键)不会被复制
跨库或需要定制时,换用 mysqldump --no-data
当目标库引擎、字符集或版本与源不同,LIKE 可能因隐式转换出问题(比如 MyISAM → InnoDB 导致全文索引失效)。这时更稳的做法是:
- 导出:
mysqldump -u user -p --no-data db_name table_name > struct.sql - 编辑
struct.sql:改表名、调整ENGINE、CHARSET、加COMMENT或外键 - 导入:
mysql -u user -p db_name
这个流程显式可控,还能加 --add-drop-table 避免重复建表报错,比 LIKE 更适合运维场景。
真正容易被忽略的是索引顺序和隐藏列——LIKE 复制的索引顺序与源表严格一致,但后续任何 DROP INDEX + ADD INDEX 操作都会打乱它;而 MySQL 8.0+ 的隐藏系统列(如 _rowid 模拟行为)根本不会出现在 LIKE 结果里,只能靠 SHOW CREATE TABLE 对比确认。











