(基础)Mysql 的 create as 和create like 区别

背景

复制表结构或是数据

写在前面
原文链接https://www.cnblogs.com/phpper/p/10773004.html
link

Mysql 5.6.51 GTID复制

例子

DROP TABLE IF EXISTS `t1`;
CREATE TABLE `t1`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID,自增',
  `uid` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '用户uid',
  `nickname` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '昵称',
  `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '用户名',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `unn`(`uid`, `name`, `nickname`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci  ROW_FORMAT = Compact;

-- ----------------------------
-- Records of t1
-- ----------------------------
INSERT INTO `t1` VALUES (3, 100, 'kaven', 'test3');
INSERT INTO `t1` VALUES (2, 101, 'maha', 'test2');
INSERT INTO `t1` VALUES (4, 102, 'loose', 'test4');
INSERT INTO `t1` VALUES (5, 105, 'balala', 'test5');

As 只复制结构,不包括索引

create table t1_copy as select * from t1 where 1=2create table t1_copy as select * from t1 limit 0

只需要表结构,所以上面的 where 1=2 或lmit 0 查询的是空数据。我们会发现新表t1_copy没有索引

补充:如果要复制数据,去掉limit 0即可或是where 1=1,也就是查询到的所有数据复制

like 完整表结构和全部索引

create table t1_copy2 like t1 

(基础)Mysql 的 create as 和create like 区别_第1张图片
注意:两种方式在复制表的时候是不会复制权限对表的设置。比如说原本对表A做了权限设置,复制表AA后,表AA并不具备类似于表A的权限。(表权限不会复制)

开启GTID是数据库,不能as

create table t1_copy as select * from t1 where 1=2;
ERROR 1786 (HY000): CREATE TABLE ... SELECT is forbidden when @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1.
问题分析:
MySQL开启gtid以后就不能使用了,MySQL只允许能够保障事务安全,并且能够被日志记录的SQL语句被执行,像create tableselectcreate temporarytable语句,以及同时更新事务表和非事务表的SQL语句或事务都不允许执行
show global variables like '%gtid_mode%';  on

针对GTID的解决办法

分两步:
1.
create table t1_copy2 like t1 
2.
insert into t1_copy2 select * from t1;

不推荐的方式:
并且最好是MySQL5.7。开启/关闭GTID,不用重启服务
1.关闭gtid(这种方式较为麻烦)set global gtid_mode='ON_PERMISSIVE';
set global gtid_mode='OFF_PERMISSIVE';
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = OFF;
set global gtid_mode='OFF';

2.执行as复制结构或是数据的操作。

3.再次开启:
set global gtid_mode='OFF_PERMISSIVE';
set global gtid_mode='ON_PERMISSIVE';
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;
set global gtid_mode='ON';
show global variables like '%gtid_mode%'; 确认状态为ON

随便提一下SQL Server的语法,oracle支持as,也是只有表结构没有索引;oracle不支持like。

select * into table_new
from table_old
where 1 = 2 --只复制表结构

select * into table_new
from table_old
where 1 = 1 --复制表结构和数据

本文说明,主要技术内容来自互联网技术大佬的分享,还有一些自我的加工(仅仅起到注释说明的作用)。如有相关疑问,请留言,将确认之后,执行侵权必删

你可能感兴趣的:(Mysql,mysql)