------------------------------------------------------分割线------------------------------------------------------
---------------------------------------------------以下是正文------------------------------------------------------

复制表分三种情况:

1、复制表的结构
2、复制表的数据
3、复制表的结构及数据

       以下用实际的例子展示这三种情况该如何复制?

       准备工作:在Navicat Premium 12软件里新建一个连接,叫localserver_test(服务器别名,自己可随意命名),在该连接下新建一个数据库,叫test,效果图如下,
在这里插入图片描述
       在test数据库下新建一张t_test表,效果图和SQL命令如下,
在这里插入图片描述

CREATE TABLE t_test
(
	id BIGINT(20) NOT NULL COMMENT '主键',
	name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
	age INT(11) NULL DEFAULT NULL COMMENT '年龄',
	email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
	PRIMARY KEY (id)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO t_test (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

       准备工作就到这里,接着进入主题!

1、复制原有表t_test的结构到另一张表t_testx(x=1,2,…),

       第一种情况:此时表t_test1是不存在的,用以下语句,

CREATE TABLE t_test1 SELECT * FROM t_test WHERE 1=2;

       或

CREATE TABLE t_test1 LIKE t_test;

       上面两条SQL语句都可以复制结构,会自动新建一张新表t_test1,但新表t_test1没有原有表t_test的数据,效果图如下,
在这里插入图片描述
== 温馨提示:虽说两条SQL语句都可以复制结构,但还是存在一些差异的,第一条SQL语句仅仅只复制了结构,而第二条SQL语句除了复制了结构以外,还复制了原有表(t_test)的主键、索引、Extra(auto_increment,字符集编码及排序)、注释、分区等属性,但是不包含触发器、外键等。 ==
       第二种情况:由于不管是sqlserver ,oracle ,mysql,access等都不可以创建空表,表中至少得有一个字段,表才能创建成功!所以没有原有表t_test复制结构到已存在的空表(无字段表)的情况。那么,如果复制原有表t_test的结构到已存在的非空表(有字段表)t_test2,该如何实现?以及效果如何呢?我们来演示一下!
       已存在的非空表t_test2情况图如下,
在这里插入图片描述
       接着,运行以下SQL语句,

SELECT * INTO t_test2 FROM t_test WHERE 1=2;

       由于本人演示用的是mysql,而mysql不支持将原有表(t_test)结构复制到另一张已存在的表里,所以效果图暂时省略,以后有时间再补充,偷个懒,略略略!

2、复制原有表t_test的数据到表t_testx(x=1,2,…),有两种情况,

       第一种情况:两表结构一样情况下
       已存在的表t_test3的情况图如下,
在这里插入图片描述
       与原有表t_test的结构完全相同,接着,运行以下SQL语句,

INSERT INTO t_test3 SELECT * FROM t_test;

       运行后效果图如下,
在这里插入图片描述
       第二种情况:两表结构不一样情况下
       已存在的表t_test4的情况图如下,
在这里插入图片描述
       与原有表t_test的结构不相同(多了一个originalfield字段),接着,运行以下SQL语句,

INSERT INTO t_test4(id,name,age,email) SELECT id,name,age,email FROM t_test;

       运行后效果图如下,
在这里插入图片描述

3、复制原有表t_test的结构及数据到另一张表t_testx(x=1,2,…),

       此时表t_test5是不存在的,用以下语句,

CREATE TABLE t_test5 SELECT * FROM t_test;

       或

CREATE TABLE t_test5 AS SELECT * FROM t_test;

       上面两条SQL语句效果相同,会自动新建一张新表t_test5,且结构及数据与原有表t_test一模一样,效果图如下,
在这里插入图片描述
       以上方式有一个不好的地方就是仅仅只复制了结构和数据,新表(t_test5)中没有了原有表(t_test)的主键、索引、Extra(auto_increment,字符集编码及排序)、注释、分区等属性,以及触发器、外键等。
       那么,如果也想把原有表(t_test)的主键、索引等一并复制过来,该如何操作呢?
       先运行以下代码,

CREATE TABLE t_test6 LIKE t_test;

       接着运行这段代码,

INSERT INTO t_test6 SELECT * FROM t_test;

== 温馨提示:推荐一个好用的SQL命令,“show create table 原有表”,运行该命令之后可以将旧表的创建命令列出,我们只需要将列出来的命令拷贝出来,更改table的名字,就可以建立一个完全一样的表 ==



-------------------------------------------------------分割线---------------------------------------------------------
---------------------------------------------下面演示单纯数据转移---------------------------------------------

数据库中,表与表的数据转移分以下几种情况:

1、相同服务器相同数据库下表与表的数据转移
2、相同服务器不同数据库下表与表的数据转移
3、不同服务器不同数据库下表与表的数据转移

       以下用实际的例子展示这三种情况该如何复制?

       准备工作:沿用上面所创建的连接(localserver_test)以及数据库(test)表(t_testx),接着继续在该连接下创建另一个空的数据库test2,另外,再新建一个远程连接,叫remoteserver_test,在该远程连接下新建一个空的数据库,叫remotetest,效果图如下,
在这里插入图片描述
在这里插入图片描述

1、相同服务器相同数据库下表与表的数据转移

       此种情况的数据转移上面已有介绍,这里总结一下,分两种情况:
       第一种情况:两表结构一样情况下

INSERT INTO t_test3 SELECT * FROM t_test;

       第二种情况:两表结构不一样情况下

INSERT INTO t_test4(id,name,age,email) SELECT id,name,age,email FROM t_test;

2、相同服务器不同数据库下表与表的数据转移

       在localserver_test连接下,将数据库test下的表t_test的数据转移至同一服务器下另一数据库test2下的表tcopy_testx(x=1,2,…)里,有两种情况,
第一种情况:目标表不存在的情况

INSERT INTO test2.tcopy_test2 SELECT * FROM test.t_test;

       运行完上面SQL语句后的效果图如下,
在这里插入图片描述
== 温馨提醒:以上SQL语句仅复制了结构和数据,并未复制原有表(t_test)的主键、索引、Extra(auto_increment,字符集编码及排序)、注释、分区等属性,以及触发器、外键等 ==
       那么,如果想把原有表(t_test)的主键、索引等一并复制过来,这个跟前面所说复制相同数据库下表跟表的结构和数据是类似的,具体代码如下,
       先运行以下代码,

CREATE TABLE test2.tcopy_test2 LIKE test.t_test;

       接着运行这段代码,

INSERT INTO test2.tcopy_test2 SELECT * FROM test.t_test;

第二种情况:目标表存在的情况
       目标表存在的情况下,又分目标表的结构与原有表相同和不相同的情况,可参考前面的代码,这里就不赘述了。


----------------------------------------------前面的都是开胃小菜----------------------------------------------
-----------------------------------------真正又难又麻烦的是下面这个-----------------------------------------

3、不同服务器不同数据库下表与表的数据转移

抱歉,突然事多起来,这个也还没理解透,后面有时间再补充了

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐