能,CREATE TABLE ... LIKE 可复制普通索引、主键、唯一约束和外键,但不复制 FULLTEXT 和 SPATIAL 索引,也不复制数据、触发器、分区、AUTO_INCREMENT 值、表注释等。
CREATE TABLE ... LIKE 能否复制索引?
能,但仅限于普通索引、主键、唯一约束和外键(如果存储引擎支持)。CREATE TABLE new_table LIKE old_table 会完整复制 old_table 的表结构定义,包括所有索引元数据,但不复制任何数据、触发器、分区定义或 AUTO_INCREMENT 当前值。
注意:该语句依赖 INFORMATION_SCHEMA 中的表定义快照,执行时原表不能被 DDL 修改(如正在 ALTER TABLE),否则可能报错 ERROR 1146 (42S02): Table doesn't exist 或出现不一致。
LIKE 语法不复制 FULLTEXT 和 SPATIAL 索引
MySQL 8.0 及之前版本中,LIKE 不会复制 FULLTEXT 或 SPATIAL 索引 —— 即使原表有,新表也不会生成。这是官方行为,不是 bug。
- 验证方式:
SHOW CREATE TABLE old_table对比SHOW CREATE TABLE new_table - 补救方法:手动添加,例如
ALTER TABLE new_table ADD FULLTEXT(col1, col2) - 若原表含
GENERATED COLUMN,其依赖的函数必须在新库中存在,否则LIKE会失败
克隆后需手动处理的常见项
索引只是表结构一部分。LIKE 不涉及运行时状态或扩展属性,以下必须单独处理:
-
AUTO_INCREMENT值重置为 1(即使原表是 10000)→ 用ALTER TABLE new_table AUTO_INCREMENT = 10000修正 - 表注释(
COMMENT)丢失 → 手动加ALTER TABLE new_table COMMENT = 'xxx' - 列注释保留,但列的
COLLATE若依赖非默认连接字符集,可能隐式降级(尤其跨 MySQL 版本时) - 无权限检查:执行用户需对原表有
SELECT权限(用于读取定义),对目标库有CREATE权限
omegafw.sepis.com.cn
rolexfw.sepis.com.cn
patekfw.sepis.com.cn
omega1.gmcwatch.cn
rolex1.gmcwatch.cn
patek1.gmcwatch.cn
omega1.swatchsh.com
rolex1.swatchsh.com
patek1.swatchsh.com
omegawx.paydyj.com
rolexwx.paydyj.com
patekwx.paydyj.com
omegawx.watchku.com
rolexwx.watchku.com
patekwx.watchku.com
替代方案:mysqldump -d + sed 更可控
当需要精确控制(比如跳过某个索引、改名、过滤注释),直接导出 DDL 更稳妥:
mysqldump -d -t --no-create-info your_db old_table | \
sed 's/old_table/new_table/g' | \
mysql your_db
注意点:
-
-d导出结构,-t跳过数据,--no-create-info避免重复建表语句 -
sed替换表名时务必用反引号包裹,防止字段名误替换(如user表里有user_id列) - 外键约束名若未显式命名,dump 出来可能是系统生成名(如
fk_12345),克隆后仍可用,但不可预测
真正麻烦的从来不是“怎么复制索引”,而是复制之后发现 FULLTEXT 没了、AUTO_INCREMENT 归零、或者字符集隐式变了——这些细节不验证一眼就漏。