应用场景
纪录MySQL报错1055:ONLY_FULL_GROUP_BY方式下的GROUP BY处置步调
2024-12-08
昨天在数据迁徙的历程中,后台接口函数无法链,因为要模拟腹地局域网,不成使用外网,是以web环境齐是腹地U盘下载的装置包,通盘环境装置完成后开动样貌发现后台无法检察数据,SQL语句会报错:“1055
- Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated”,之前碰到过近似的作假,然而莫得去纪录,导致问题再刻下又是度娘结局额的,是以长个记性纪录下,但其实它的原因并不复杂。
这个作假的产生,主若是因为在MySQL数据库版块为5.7及以上时,默许开启了ONLY_FULL_GROUP_BY SQL方式。在这个方式下,关于GROUP BY操作有严格的条件:SELECT语句中的查询列,如果不在GROUP BY子句中出现,那么这个查询即是违纪的。这是因为,非团聚列在GROUP BY操作中莫得明确的值,是以MySQL无法详情若何对这些列进行分组。
为了处置这个问题,咱们不错罗致以下两种步调:
第一种步调
在MySQL的树立文献中进行设立。关于Linux系统,咱们需要裁剪【/etc/my.cnf】文献,在[mysqld]树立中添加或修改sql_mode字段。
关于Windows系统,咱们需要裁剪MySQL装置目次下的【my.ini】文献,一样在[mysqld]树立中添加或修改sql_mode字段。
BASIC
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
在添加或修改完sql_mode字段后,如图:
咱们需要保存文献并重启MySQL做事,以使设立奏效。
第二种步调
在Navicat中,输入下列SQL语句进行查询:
BASIC
SELECT &GLOBAL.sql_mode;
查询效果如下,近似如下:
BASIC
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
通过上头的查询效果,不错看到 开启了 ONLY_FULL_GROUP_BY 方式,这里第一种处置决策即是,去除 ONLY_FULL_GROUP_BY,从头设立值。
呐喊如下:www.actoken.cn
BASIC
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';
实行完上头的SQL语句之后,再次实行报错的SQL语句,发现不错通常开动了。
另外树下,修改之后一定一定需要重启mysql时间使其奏效。好了,修改完成样貌开动一切通常,有问题留言响应,关于不属于sql域名的径直在文献里添加然后重启mysql就行,否则出错就不好弄了,还要牢记备份啊!