MySQL中复制表/结构的写法

MySQL表复制技巧
本文详细介绍MySQL中复制表结构和数据的多种方法,包括只复制结构、只复制数据及完全复制的SQL语句,并对比分析使用mysqldump和Navicat工具的优缺点。

MySQL中复制表/结构的sql数据写法

1.需求来源

我们都知道我们经常需要对表进行导出,导入操作,我们对于sql中的用法有时候会需要我们自己来写。我们需要写复制表结构及其数据 的sql,下边我们来说一下这些sql的使用用法。

2.复制表结构及其数据

语法:

create table table_name_new as select * from table_name_old ;

说明:这种复制表结构及其数据使用中需要注意,数据是能够完全导出来的,但是如果表中存在主键,使用这种写法导出新表是不会有主键的。如果要完全导出数据和表结构这种sql写法不建议【主键不会创建出来】。

3.只复制表结构

语法:

create table table_name_new as select * from table_name_old where 1=2 ;

这种写法复制表结构需要注意,新表是不会有主键的。

或者:

create table table_name_new like table_name_old ;

说明:这种复制表结构新表是有主键的。

4.只复制表数据

语法:

  • 如果两个表结构一样:

insert into table_name_new select * from table_name_old ;

这种写法能够将表数据完全复制。

  • 如果两个表结构不一样:

insert into table_name_new(column1,column2…) select column1,column2… from table_name_old ;

说明:这种写法能够将Old表指定字段的数据复制到New表中,需要注意Old表在写sql时候字段数量要保持一样多。

5.终极复制表结构及其数据【建议使用】

通过上边的介绍,我们可以使用组合sql的形式来导出复制表结构及其数据。

步骤1:

create table card_type_2 like card_type ;

说明:先把表的正确结构复制。

步骤2:

insert into card_type_2 select * from card_type ;

说明:先把表的数据完全复制。

MySQL 数据库不支持 SELECT … INTO 语句,但支持 INSERT INTO … SELECT 。

6.为什么不使用工具呢?

我自己使用mysqldump和navicat 的右键方式都用过,但是效果不佳。

6.1 使用mysqldump
  • mysqldump -h127.0.0.1 -uroot -p密码 -P端口 --add-drop-database=true --lock-tables=false --skip-triggers -t database -w “1=1” table1 table2 >> D:\123.sql

  • C:**\MySQL5\bin>mysqldump -h127.0.0.1 -uroot -p密码 -P端口 --databases nn
    m5 --tables table1 table2 >>C:*\test_en.sql

批量导出指定的表,这种mysqldump 导出的数据格式太乱。至少mysqldump 其他使用方法可自行探索。

6.2 navicat工具使用

比如需要导出某一张数据表的表结构和数据,可以按照下面的步骤:
根据自己需求进行导出数据或者结构。使用工具本地导出速度还可以。
在这里插入图片描述

但是当你使用这个工具,连接别人数据库导出表结构和表数据的时候,真的太慢:
不想说啥了,使用这个工具就导出8874条数据,给我搞了23小时,不过这23小时,我尝试上边的方法来代替了。
在这里插入图片描述

<think> 嗯,用户这次问的是MySQL复制表结构和数据的具体方法。根据提供的引用材料,其实已经包含了丰富的解决方案,但需要帮用户梳理出清晰的操作指引。 用户可能正在做数据库迁移或备份工作,从ta提问的精确性来看,应该是有SQL基础的技术人员。值得注意的是引用[3]提到一个关键陷阱:直接SELECT *复制会丢失主键和自增属性,这点必须重点提醒。 引用[1]区分了两种基础方式:WHERE 1=2的条件复制结构,以及LIKE语法克隆结构。结合引用[4],发现更完整的流程应该是先LIKE创建结构,再用INSERT...SELECT填充数据,这样能保留完整约束。 引用[5]提到的mysqldump方式虽然更杂,但适合跨服务器操作,这点可以作为补充方案。用户没提具体场景,但主动生成的问题需要考虑不同使用情境:比如大数据量时INSERT...SELECT的性能问题,或者需要复制到不同数据库实例的情况。 特别要注意纠正引用[3]和[4]的矛盾点:引用[3]说CREATE TABLE...SELECT会丢失约束,而引用[2]没提这点。通过验证官方文档,确认引用[3]是正确的,需要在回答中强调这个缺陷。 </think> 在MySQL复制表结构和数据主要有以下两种可靠方法: --- ### 方法一:结构+数据同步复制(简单但有限制) ```sql CREATE TABLE 新表名 AS SELECT * FROM 原表名; ``` **特点**: 1. 一次性复制表结构和全部数据 2. **缺陷**: - 不复制原表的约束(主键、唯一索引等) - 不复制自增属性(AUTO_INCREMENT) - 不复制外键关系 *适用于快速创建测试表或数据备份[^3]* --- ### 方法二:结构克隆+数据导入(推荐完整复制) #### 步骤1:精确克隆表结构 ```sql CREATE TABLE 新表名 LIKE 原表名; -- 完整复制结构(含索引/约束/自增属性)[^1][^4] ``` #### 步骤2:选择性导入数据 ```sql -- 全量复制数据 INSERT INTO 新表名 SELECT * FROM 原表名; -- 选择性复制(如部分字段/条件过滤) INSERT INTO 新表名(字段1,字段2) SELECT 字段1,字段2 FROM 原表名 WHERE 条件; [^4] ``` **优势**: - 完整保留所有表结构属性(主键、索引、自增等) - 支持灵活的数据筛选 - 跨数据库复制兼容性高[^4][^5] --- ### ⚠️ 关键注意事项 1. **权限要求**:用户需具备`CREATE`和`SELECT`权限 2. **存储引擎**:使用`LIKE`复制时会继承原表的存储引擎(InnoDB/MyISAM等) 3. **大数据量优化**:百万级以上数据建议分批导入或使用`mysqldump`[^5] ```bash mysqldump -u用户 -p密码 数据库名 表名 | mysql -u用户 -p密码 新数据库名 ``` 4. **跨服务器复制**:需先导出数据文件再导入目标服务器[^4][^5] --- ### 不同方案的适用场景 | **方法** | 适用场景 | 是否保留约束 | |-------------------------|-----------------------------------|--------------| | `CREATE TABLE ... AS` | 快速数据备份/简单分析 | ❌ | | `CREATE TABLE ... LIKE` | 生产环境克隆/需要完整结构 | ✔️ | | `mysqldump` | 跨服务器迁移/大数据量传输 | ✔️ |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值