MySQL提示:1055 (42000): SELECT list is not in GROUP BY clause and contains nonaggregated column

问题现象

在执行MySQL命令进行查询时,提示如下错误:

1055(42000): SELECT list is not in GROUP BY clause and contains nonaggregated column

可能原因

该报错可能由以下两种原因引入:

  • 原因一:

    用户修改了sql_mode参数,加上了ONLY_FULL_GROUP_BY条件,导致GROUP BY的语法不符合规范。

  • 原因二:

    业务侧使用的驱动程序修改了sql_mode参数值。例如,业务侧使用的ADO.NET驱动程序修改了sql_mode参数值,导致GROUP BY报错。

    现象

    如上图所示,当执行的INSERT语句需要返回自增列的值时,驱动程序会在执行INSERT语句前,自动修改当前会话上的sql_mode参数值,并且不会在INSERT语句执行完之后将sql_mode恢复为原参数值。如果当前会话被继续使用,会导致后续执行包含GROUP BY的SELECT语句时出现报错。

解决方案

根据可能原因对应以下两种解决方案:

  • 方案一:在RDS控制台的参数设置页面,修改sql_mode参数取值,去掉ONLY_FULL_GROUP_BY条件,忽略GROUP BY的严格检查。修改方法,请参见设置实例参数
  • 方案二:如果使用了ADO.NET驱动程序,需要用户在业务侧执行INSERT语句之后,执行查询之前,在业务侧代码中,增加修改sql_mode参数的语句,将sql_mode参数修改为默认值。

    命令示例如下:

    SET session sql_mode = default;