在MySQL数据库的实际使用中,两张表之间的完全复制是高频操作,既可以复制表结构,也可以复制表数据,还能同时完成结构和数据的复制,不同的需求对应不同的SQL语句写法。

仅复制表结构
如果只需要复制原表的表结构,不需要复制数据,可以使用CREATE TABLE ... LIKE语句,该语句会复制原表的字段定义、索引、主键等所有结构信息,不会复制数据。
-- 复制table1的结构到table2,table2不存在时执行 CREATE TABLE table2 LIKE table1;
如果目标表已经存在,想要清空结构重新复制,可以先删除目标表再执行上述语句,或者使用CREATE TABLE ... AS结合WHERE 1=0的方式,这种方式只会复制字段的基本定义,不会复制索引、主键等约束。
-- 目标表已存在时,清空后复制结构(仅基础字段,无约束) TRUNCATE TABLE table2; INSERT INTO table2 SELECT * FROM table1 WHERE 1=0;
仅复制表数据
当两张表的结构完全一致,只需要复制数据到目标表时,可以使用INSERT INTO ... SELECT语句,该语句会将查询结果插入到目标表中。
-- table1和table2结构完全一致,复制所有数据 INSERT INTO table2 SELECT * FROM table1;
如果只需要复制部分数据,可以在SELECT语句后添加WHERE条件筛选需要的数据。
-- 复制table1中id大于100的数据到table2 INSERT INTO table2 SELECT * FROM table1 WHERE id > 100;
如果两张表的字段不完全一致,需要指定对应的字段名,确保字段顺序和类型匹配。
-- 两张表字段不完全一致,指定对应字段复制 INSERT INTO table2 (col1, col2, col3) SELECT col_a, col_b, col_c FROM table1;
同时复制表结构和数据
如果需要一次性完成表结构和数据的完全复制,可以使用CREATE TABLE ... AS SELECT语句,该语句会创建新表并插入查询到的数据,但是不会复制原表的索引、主键等约束。
-- 同时复制table1的结构和数据到table2,table2不存在时执行 CREATE TABLE table2 AS SELECT * FROM table1;
如果需要保留原表的索引和主键,建议先使用CREATE TABLE ... LIKE复制结构,再使用INSERT INTO ... SELECT复制数据,这是最稳妥的完全复制方式。
-- 先复制结构,再复制数据,保留所有约束 CREATE TABLE table2 LIKE table1; INSERT INTO table2 SELECT * FROM table1;
注意事项
- 执行复制操作前,建议先备份目标表数据,避免数据被覆盖丢失。
- 如果原表有自增主键,复制数据后目标表的自增起始值不会自动同步,需要手动调整。
- 复制大表数据时,可能会产生大量事务日志,建议分批复制或者调整数据库配置。
- 如果两张表的字符集或者排序规则不一致,可能会导致复制失败,需要先统一相关配置。
MySQLSQL表复制INSERT_INTO_SELECT数据迁移修改时间:2026-07-06 17:24:20