二十五岁时我们都一样愚蠢、多愁善感,喜欢故弄玄虚,可如果不那样的话,五十岁时也就不会如此明智。
标题:MySQL INSERT INTO SELECT 复制表
有时候我们可能需要将一张表完全的复制到另一张表,包括表的结构,索引,默认值等
MySQL 有没有这样的命令能够完成这样的任务呢?
有,也没有
说没有,是因为没有直接哪个命令能做这件事
说有,是因为可以用一序列之前学的命令完成这项任务
复制表
我们也不多介绍了,直接说要如何做吧
使用
SHOW CREATE TABLE命令获取创建数据表 (CREATE TABLE) 语句,该语句包含了原数据表的结构,索引等复制
1中的 SQL 语句,修改数据表名,并执行 SQL 语句,完整的克隆出一个数据表结构一模一样的表如果需要复制表的内容,可以使用
INSERT INTO ... SELECT语句来实现演示
运行下面的 SQL 语句创建测试数据
DROP TABLE IF EXISTS `tbl_language`; CREATE TABLE IF NOT EXISTS `tbl_language`( `id` INT UNSIGNED AUTO_INCREMENT, `name` VARCHAR(64) NOT NULL, `url` VARCHAR(128) NOT NULL, `founded_at` DATE, PRIMARY KEY ( `id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO `tbl_language` VALUES (1,'Python','https://www.twle.cn','1991-2-20'), (2,'PHP','http://www.php.net','1994-1-1'), (3,'Ruby','https://www.ruby-lang.org/','1996-12-25');使用
SHOW CREATE TABLE tbl_language\G;命令查看创建表tbl_language的语法MariaDB [twle]> SHOW CREATE TABLE tbl_language\G; *********************** 1. row *********************** Table: tbl_language Create Table: CREATE TABLE `tbl_language` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(64) NOT NULL, `url` varchar(128) NOT NULL, `founded_at` date DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 1 row in set (0.00 sec)会显示两个字段,一个字段是当前的表名,另一个字段是创建表的语句
复制上面的语句,修改表名为
tbl_lang并运行修改后的 SQL 语句CREATE TABLE `tbl_lang` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(64) NOT NULL, `url` varchar(128) NOT NULL, `founded_at` date DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;如果要复制数据,则可以使用下面的语句
INSERT INTO tbl_lang SELECT * FROM tbl_language;
执行
SELECT * FROM tbl_lang;查看下表中的数据MariaDB [twle]> SELECT * FROM tbl_lang; +----+--------+----------------------------+------------+ | id | name | url | founded_at | +----+--------+----------------------------+------------+ | 1 | Python | https://www.twle.cn | 1991-02-20 | | 2 | PHP | http://www.php.net | 1994-01-01 | | 3 | Ruby | https://www.ruby-lang.org/ | 1996-12-25 | +----+--------+----------------------------+------------+ 3 rows in set (0.01 sec)真的,一模一样