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

大多数程序员所在的公司可能都延迟开工了,在空闲下来的时间里是学习的绝佳时机,千万不能错过!

今天,我给大家介绍两种,不常用也不常见的两种表复制方式。

在开始之前,我们先看看我的测试表结构和数据。

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 是不支持的,并且它也不支持复制约束,索引以及触发器!

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

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

原创文章,作者:dweifng,如若转载,请注明出处:https://blog.ytso.com/252449.html

(0)
上一篇 2022年5月4日
下一篇 2022年5月4日

相关推荐

发表回复

登录后才能评论