以only_full_group_by 为例,其他的设置看每个设置的意思就懂了。
原因: mysql 使用group by语句的时候,group by子句中必须包含所有select的非聚合列, 否则就会提示这个错误。
聚合列类似(SUM,AVG,MAX,MIN) 这种计算得出的列。
MySQL 5.7.5之后的版本实现了对功能依赖的检测。如果启用了ONLY_FULL_GROUP_BY 模式(默认情况下是这样),那么MySQL就会校验 group by子句后的列名,必须和select的所有非聚合列都对应。
修改mysql的模式,
mysql> select @@sql_mode; +-------------------------------------------------------------------+ | @@sql_mode | +-------------------------------------------------------------------+ | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +-------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> set global sql_mode= 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; Query OK, 0 rows affected (0.00 sec)set session sql_mode :
这种修改方式,只在当前session作用域有效。关闭重新打开后失效。
set global sql_mode:
这种修改方式,只在该次mysql服务运行期间有效,重启mysql后失效。
所以最好修改mysql的配置文件。
windows是在mysql安装目录下,新建(如果有就修改)一个my.ini 文件,里面设置sql_mode;
linux 是/etc/my.cnf 文件中 [mysqld] 下面设置sql_mode
mysql5.0以上版本支持三种sql_mode模式:
ANSI模式宽松模式,对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报warning警告。TRADITIONAL模式严格模式,当向mysql数据库插入数据时,进行数据的严格校验,保证错误数据不能插入,报error错误。用于事物时,会进行事物的回滚。STRICT_TRANS_TABLES模式严格模式,进行数据的严格校验,错误数据不能插入,报error错误。