本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
大多数程序员所在的公司可能都延迟开工了,在空闲下来的时间里是学习的绝佳时机,千万不能错过!
今天,我给大家介绍两种,不常用也不常见的两种表复制方式。
在开始之前,我们先看看我的测试表结构和数据。
CREATE TABLE `xttblog` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'test1',
`name` varchar(255) NOT NULL DEFAULT '' COMMENT 'www.xttblog.com',
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `index_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
BEGIN;
INSERT INTO `xttblog` VALUES ('1', '1', '1'), ('2', 'a', '1');
COMMIT;
1、create table like。这种语句,Oracle 中没有,但是 pg 等数据库都支持。用法如下:
CREATE TABLE new_table LIKE xttblog;
这种方式将表 xttblog 复制到 new_table 时候会将表 xttblog 完整的字段结构和索引复制到表 new_table 中来,但是不会复制数据。不复制数据也就意味着不会复制外键约束。
官方原话为:
The LIKE form of CREATE TABLE allows you to copy an existing table definition exactly (without copying its data). In contrast to CTAS, the statement below creates a new empty_key_value_store table whose definition exactly matches the existing key_value_store in all particulars other than table name. The new table contains no rows.
MySQL 官网
翻译过来的大致意思是说:CREATE TABLE 创建表的形式允许您精确地复制现有表定义(不复制其数据),其创建的表除了表名和源表不一样外,其余所有的细节都是一样的。但是没有源表的数据。所以这种 create table like 的形式非常适合对源表模式的复制。实际开发中其实用的也不是太多,更多细节参考官网:https://dev.mysql.com/doc/refman/8.0/en/create-table-like.html
如果想要复制数据,则可以使用 create table as。
2、create table as。这种语句,很多数据库都支持,下面看一个例子。
create table new_xttblog as SELECT * from xttblog;
create table as 的缺点是,它只复制表结构和表数据,不会复制表的主键和索引。主键也是一种索引,所以我们也可以统一的说,它不会复制表中的索引。
更多的细节,建议参考官网:https://dev.mysql.com/doc/refman/8.0/en/create-table-select.html。
3、完整的复制表。
前面两种方式都有缺陷,如果想完整的复制表,则可以这样做。
CREATE TABLE new_t LIKE xttblog;
INSERT INTO new_t SELECT * FROM xttblog;
4、create table as 的变种用法。
虽然,create table as 只复制表结构和数据,但是它还有另外一种用法,让复制的表数据的时候先创建表。
CREATE TABLE xttblog_new
(
id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY
)
AS
(
SELECT * FROM xttblog
);
创建表的时候,我们可以对其中的一些字段设置主键,索引等内容。没有显示指定的字段,将直接复制,但不会复制索引。
desc xttblog_new;
show index from xttblog_new;
上面的两个语句可以查看表结构和索引。create table as 的另外一个特点是,可以在复制表时新增字段。
CREATE TABLE taoge
(
id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
card_no VARCHAR(18)
)
AS
(
SELECT * FROM xttblog
);
最后,INSERT INTO SELECT 我就不说了,而 SELECT INTO FROM 显然 MySQL 是不支持的,并且它也不支持复制约束,索引以及触发器!
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » MySQL create table like 和 create table as 拷贝复制表