Java基础、中级、高级、架构面试资料

MySQL create table like 和 create table as 拷贝复制表

SQL herman 3038浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日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 拷贝复制表