mysql8 only_full_group_by 的解决办法
侧边栏壁纸
  • 累计撰写 194 篇文章
  • 累计收到 31 条评论

mysql8 only_full_group_by 的解决办法

五好
2018-12-17 / 0 评论 / 2,921 阅读 / 正在检测是否收录...
Error Code: 1055. Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'table.key' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

以上是报错信息,根据这个报错信息 在网海里捞了一捞,发现大部分的结果都是类似这样的

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';

然而设置了却没有起作用.
正确的设置方法 如下:

set @@session.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

当然sql_mode 的值 最好根据

select  @@global.sql_mode  得到的结果 做修改.把得到的值 中的ONLY_FULL_GROUP_BY去掉

还有另外一个解决办法 就是通过 any_value()这个内置函数

SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;

在这种情况下,MySQL 会忽略address每个name组中值 的不确定性 并接受查询。如果您根本不关心为每个组选择非聚合列的哪个值,这可能很有用。 ANY_VALUE()不是聚合函数,与SUM()或 等函数不同 COUNT()。它只是起到抑制非确定性测试的作用。

文档中给出了抛出这个错误的3种解决办法分别是:

1.更改表以创建name主键或唯一NOT NULL列
2.使用any_value
3.禁用 ONLY_FULL_GROUP_BY

参考:https://dev.mysql.com/doc/refman/8.0/en/miscellaneous-functions.html#function_any-value

0

评论 (0)

取消