文章目录
- 项目场景:
- 原因分析及解决方案:
- 总结:
项目场景:
提示:这里简述项目相关背景:
which is not functionally dependent on columns in GROUP BY clause;
this is incompatible with sql_mode=only_full_group_by
它在功能上不依赖于GROUP BY子句中的列;这与sqlmode=onlyfull_groupby
不兼容
原因分析及解决方案:
提示:这里填写问题的分析该及问题的具体解决方案:
这个问题与MySQL的SQL模式设置有关,具体来说是ONLY_FULL_GROUP_BY
模式。
这个模式要求:当使用GROUP BY
时,SELECT
的列必须在GROUP BY
子句中,或者它们必须被一个聚合函数所包含。
所以需要知道当前MySQL服务器的sql_mode
设置:
SELECT @@global.sql_mode;
如果你看到ONLY_FULL_GROUP_BY
在返回的结果中,那就是这个问题。
我的返回结果:ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
要永久解决这个问题,需要修改MySQL服务器的配置文件以移除ONLY_FULL_GROUP_BY
。这个配置文件的位置取决于你的操作系统和MySQL版本,但是通常位于my.ini
配置文件中
找到一个名为[mysqld]
的部分,其中包含了各种设置。需要找到sql_mode
设置,并从其中移除ONLY_FULL_GROUP_BY
。
根据上面我的返回结果,我的sql_mode
设置应该将其设置为:
[mysqld]
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
保存并关闭配置文件后,需要重启MySQL服务器以使更改生效。在大多数系统上,可以通过任务管理器中找到mysql,打开服务:
最后再次打开Navicat看看是否报错,并重新运行SELECT @@global.sql_mode;
及时检查
总结:
提示:这里填写该问题的解决过程的总结:
查询当前MySQL服务器的sql_mode
设置。
SELECT @@global.sql_mode;
去掉返回结果中的ONLY_FULL_GROUP_BY,
,只保留STRICT
及后面的东西:sql_mode='STRICT_XXXXX'
然后重启 mysql服务器,打开Navicat重新运行查询当前MySQL服务器的sql_mode
设置的代码,看返回结果中是否还包含GROUP_BY,不包含就对了