group by查询语句:
select fprojectid,fteamid,fprojectname,fdevmanage,ftestmanage,fcreateuser,fcreatetime,fupdatetime
from t_project group by fprojectid;
报错:
然后我用的是Navicat premium 可视化工具。
查询mysql版本号:SELECT VERSION();
查询结果是5.7.20
查询SQL模式: SELECT @@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
在可是化工具里面设置sql_mode:set @@sql_mode='NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES'
查询SELECT @@sql_mode; 看到结果修改成功了。
运行group by语句就没有报错。
但是我再重启Navicat,查看sql_mode看到我的sql_mode还是之前的,并没有修改成功。说明用命令修改参数,可能当前会话生效,可以全局生效;但是数据库重启之后都会失效。
于是想到去修改my.ini文件,在文件中加上sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
重启Navicat查询还是没有会报错。
于是尝试Windows DOS命令下使用root权限修改mysql的配置:
全局的这么设置:
set @@global.sql_mode='NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES'
重启mysql,发现sql_mode是否修改成功!
你再去Navicat 运行group by语句,终于没有报错了。
sql_mode的参数很多,有些是针对特殊场景的。
可以了解一下这些参数代表的意义。
ONLY_FULL_GROUP_BY:
如果在SELECT中的列,没有在GROUP BY中出现,那么将认为这个SQL是不合法的。
只能select column1 from tb1 group by column1,只能展示group by的字段,其他字段都报1055错。
STRICT_TRANS_TABLES :
在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做任何限制。
NO_ENGINE_SUBSTITUTION: