MySQL中表的克隆有多种,常用的是create table as和create table like,两者有所差别。
① reate table as 只能部分克隆表结构,但完整保留数据
② create table like会完整地克隆表结构,但不会插入数据,需要单独使用insert into或load data方式加载数据
1.准备工作
先准备一些测试数据:
CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `user_name` varchar(200) DEFAULT '', `phone` varchar(200) DEFAULT '', `b_code` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; INSERT INTO `db2020`.`user`(`id`, `user_name`, `phone`, `b_code`) VALUES (1, '李明', '101', '2021001'); INSERT INTO `db2020`.`user`(`id`, `user_name`, `phone`, `b_code`) VALUES (2, '赵慧', '456', '2020001'); INSERT INTO `db2020`.`user`(`id`, `user_name`, `phone`, `b_code`) VALUES (3, '李凯', '123', '2021002'); INSERT INTO `db2020`.`user`(`id`, `user_name`, `phone`, `b_code`) VALUES (6, '张三1', '123', '2022001'); INSERT INTO `db2020`.`user`(`id`, `user_name`, `phone`, `b_code`) VALUES (7, '张三2', '123', '2021003');
查询表说明如下:
desc user;
查询的结果如下:
select * from user
2.create table as
使用create table as复制表:
create table user_bk as select * from user;
1)查询表数据:
select * from user_bk
2)查询表说明:
desc user_bk
会发现数据可完整的复制过来,但主键、自动递增和索引丢失了。
上述复制的全部的数据,当然也可以只复制部分数据,在后面添加where条件即可
create table user_bk as select * from user where b_code like '2021%';
对于5.6及以上的版本内,MySQL默认开启了 enforce_gtid_consistency=true 功能,若不关闭,则会出现下面的错误:
Statement violates GTID consistency
关闭的命令:
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = off;
3.create table like
使用create table like复制表:
create table user_bk2 like user;
1)查询表数据:
select * from user_bk2
2)查询表说明:
desc user_bk
会发现数据结构可完整的复制过来,但没有数据。
3)解决方案
若想完整的复制表结构和数据,只能使用like这种方式。先复制表结构,然后使用insert into复制数据过来。
create table user_bk3 like user; insert into user_bk3 select * from user;
使用两条语句即可执行表的复制。