阿里云RDS数据库执行存储过程的时候:StatementviolatesGTIDconsistency:CREATETABLE...SELECT
(2018-05-29 00:13:14)
标签:
阿里云rdsmysql |
分类: 互联网知识 |
使用阿里云RDS数据库mysql执行存储过程的时候提示:Statement violates GTID consistency:
CREATE TABLE ... SELECT、
这是因为在5.6及以上的版本内,开启了
enforce_gtid_consistency=true 功能导致的,MySQL官方解释说当启用
enforce_gtid_consistency
功能的时候,MySQL只允许能够保障事务安全,并且能够被日志记录的SQL语句被执行,像create table … select 和
create temporarytable语句,以及同时更新事务表和非事务表的SQL语句或事务都不允许执行。
网上给出的解决方法是修改 :SET
@@GLOBAL.ENFORCE_GTID_CONSISTENCY = off; 配置文件中
:ENFORCE_GTID_CONSISTENCY = off;
但是阿里云的售后技术: 您好,这个涉及到主从同步,这个肯定是不可该的,我们默认使用的是gtid方式。
我建议您改代码,改成如下方式,可以实现create table as select功能:
create table aaa like bbb insert into aaa select * from bbb
用人家的产品,当然要听从人家技术的建议!
适当的研究了create table **** like ****
1.
CREATE TABLE A LIKE B
此种方式在将表B复制到A时候会将表B完整的字段结构和索引复制到表A中来。
2.
CREATE TABLE A AS SELECT x,x,x,xx FROM B LIMIT 0
此种方式只会将表B的字段结构复制到表A中来,但不会复制表B中的索引到表A中来。这种方式比较灵活可以在复制原表表结构的同时指定要复制哪些字段,并且自身复制表也可以根据需要增加字段结构。
两种方式在复制表的时候均不会复制权限对表的设置。比如说原本对表B做了权限设置,复制后,表A不具备类似于表B的权限。
既然RDS建议我们用CREATE TABLE A LIKE B
,那就考虑这个!
但是刚开始直接搬照仿用,
Create table
beehoneylistgroup LIKE beehoneylistdetail;
insert into beehoneylistgroup Select
UserID,LayerNumGet,sum(BeeHoney) as BeeHoneySum from
beehoneylistdetail where status=0 group by
UserID,LayerNumGet;
如上,就提示字段数量不一致!
后来仔细查看,原来CREATE TABLE A LIKE B
将表B复制到A时候会将表B完整的字段结构和索引复制到表A中来。这种方式不够灵活,不能像CREATE TABLE A AS SELECT
x,x,x,xx FROM B LIMIT 0这种方式一样,随意复制表的哪些字段。
那干脆我们就直接自己建表结构,不去like或者as了!^_^
Create table beehoneylistgroup(userid VARCHAR(20),LayerNumGet
int,BeeHoneySum DECIMAL(18,2));
insert into beehoneylistgroup Select
UserID,LayerNumGet,sum(BeeHoney) as BeeHoneySum from
beehoneylistdetail where status=0 group by
UserID,LayerNumGet;
如上,我们建造自己需要的字段的表,然后再去赋值!这样就可以了!