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;
使用兩條語句即可執行表的復制。