Mysql执行语句报错this is incompatible with sql_mode=only_full_group_by

报错的输出:

[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column ‘information_schema.PROFILING.SEQ’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

解决办法:

1. 使用sql语句直接进行设置
查看sql_mode,主要是看值是否有“only_full_group_by”值,目的把此值去掉
注意:只设置global,需要重新连接进来才会生效

查看当前连接会话的sql模式:

mysql> select @@session.sql_mode;
或者从环境变量里取
mysql> show variables like "sql_mode";


查看全局sql_mode设置:
mysql> select @@global.sql_mode;
只设置global,需要重新连接进来才会生效

设置sql_mode

形式如
mysql> set sql_mode='';
mysql> set global sql_mode='NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES';


如果是自定义的模式组合,可以像下面这样

Adding only one mode to sql_mode without removing existing ones:
mysql> SET sql_mode=(SELECT CONCAT(@@sql_mode,',<mode_to_add>'));

Removing only a specific mode from sql_mode without removing others:
mysql> SET sql_mode=(SELECT REPLACE(@@sql_mode,'<mode_to_remove>',''));

看不懂上面的可以先看这一句,或者直接执行这个依据进行全局设置sql_mode(设置之后需要重启mysql和重新连接)

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));  

2. 修改配置文件my.cnf进行设置sql_mode去掉ONLY_FULL_GROUP_BY这个值
注意:此系统是用的ubuntn17.10的mysql,在配置的时候如果在my.cnf没有找到该配置项,就去找该文件includedir所指定的目录去看一下引用的配置

sql_mode常用值说明

官方手册专门有一节介绍。 SQL Mode 定义了两个方面:MySQL应支持的SQL语法,以及应该在数据上执行何种确认检查。

  1. SQL语法支持类
    • ONLY_FULL_GROUP_BY 对于GROUP BY聚合操作,如果在SELECT中的列、HAVING或者ORDER BY子句的列,没有在GROUP BY中出现,那么这个SQL是不合法的。是可以理解的,因为不在 group by 的列查出来展示会有矛盾。
      在5.7中默认启用,所以在实施5.6升级到5.7的过程需要注意:

      Expression #1 of SELECT list is not in GROUP BY
      clause and contains nonaggregated column
      '1066export.ebay_order_items.TransactionID' which
      is not functionally dependent on columns in GROUP BY
      clause; this is incompatible with sql_mode=only_full_group_by
    • ANSI_QUOTES 启用 ANSI_QUOTES 后,不能用双引号来引用字符串,因为它被解释为识别符,作用与 ` 一样。设置它以后,update t set f1=”” …,会报 Unknown column ” in ‘field list 这样的语法错误。
    • PIPES_AS_CONCAT 将 || 视为字符串的连接操作符而非 或 运算符,这和Oracle数据库是一样的,也和字符串的拼接函数 CONCAT() 相类似。
    • NO_TABLE_OPTIONS 使用 SHOW CREATE TABLE 时不会输出MySQL特有的语法部分,如 ENGINE ,这个在使用 mysqldump 跨DB种类迁移的时候需要考虑。
    • NO_AUTO_CREATE_USER 字面意思不自动创建用户。在给MySQL用户授权时,我们习惯使用 GRANT … ON … TO dbuser 顺道一起创建用户。设置该选项后就与oracle操作类似,授权之前必须先建立用户。5.7.7开始也默认了。

  1. 数据检查类
    • NO_ZERO_DATE 认为日期 ‘0000-00-00’ 非法,与是否设置后面的严格模式有关。
      1. 如果设置了严格模式,则 NO_ZERO_DATE 自然满足。但如果是 INSERT IGNORE 或 UPDATE IGNORE,’0000-00-00’依然允许且只显示warning
      2. 如果在非严格模式下,设置了NO_ZERO_DATE,效果与上面一样,’0000-00-00’允许但显示warning;如果没有设置NO_ZERO_DATE,no warning,当做完全合法的值。
      3. NO_ZERO_IN_DATE情况与上面类似,不同的是控制日期和天,是否可为 0 ,即 2010-01-00 是否合法。
    • NO_ENGINE_SUBSTITUTION 使用 ALTER TABLE或CREATE TABLE 指定 ENGINE 时, 需要的存储引擎被禁用或未编译,该如何处理。启用NO_ENGINE_SUBSTITUTION时,那么直接抛出错误;不设置此值时,CREATE用默认的存储引擎替代,ATLER不进行更改,并抛出一个 warning .
    • STRICT_TRANS_TABLES 设置它,表示启用严格模式。
      注意 STRICT_TRANS_TABLES 不是几种策略的组合,单独指 INSERT、UPDATE出现少值或无效值该如何处理:
      1. 前面提到的把 ” 传给int,严格模式下非法,若启用非严格模式则变成0,产生一个warning
      2. Out Of Range,变成插入最大边界值
      3. A value is missing when a new row to be inserted does not contain a value for a non-NULL column that has no explicit DEFAULT clause in its definition

附LINUX系统操作MYSQL常用指令

1.终端启动MySQL:/etc/init.d/mysql start2.登录MySQL:mysql -uroot -p (用root账户登录),然后输入密码; 
3.查看所有的数据库名字:show databases; 
4.选择一个数据库操作: use database_name; 
5.查看当前数据库下所有的表名:show tables; 
6.创建一个数据库:create database database_name; 
7.删除一个数据库:drop database database_name; 
8.创建一个表: create table mytest( uid bigint(20) not null, uname varchar(20) not null); 
9.删除一个表: drop table mytest; 
10.SQL插入语句:insert into table_name(col1,col2) values(value1,value2); 
11.SQL更新语句:update table_name set col1='value1',col2='value2' where where_definition; 
12.SQL查询语句:select * from table_name where.......(最复杂的语句) 1
3.SQL删除语句:delete from table_name where... 
14.增加表结构的字段:alert table table_name add column field1 date ,add column field2 time... 
15.删除表结构的字段:alert table table_name drop field1; 
16.查看表的结构:show columns from table_name; 
17.limit 的使用:select * from table_name limit 3;//每页只显示3select * from table_name limit 3,4 //从查询结果的第三个开始,显示四项结果。 此处可很好的用来作分页处理。 
18.对查询结果进行排序: select * from table_name order by field1,orderby field2;多重排序
19.退出MySQL:exit; 
20.删除表中所有数据: truncate table 数据表名称 (不可恢复)

猜你喜欢

转载自blog.csdn.net/a656678879/article/details/80393788
今日推荐