mysql执行查询语句出现sql_mode=only_full_group_by

Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘sdpjw-test.corp_activity.sys_user_id’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

产生原因:

一、原理层面
这个错误发生在mysql 5.7.5 版本及以上版本会出现的问题:
mysql 5.7.5版本以上默认的sql配置是:sql_mode=“ONLY_FULL_GROUP_BY”,这个配置严格执行了"SQL92标准"。
很多从5.6升级到5.7时,为了语法兼容,大部分都会选择调整sql_mode,使其保持跟5.6一致,为了尽量兼容程序。
二、sql层面
在sql执行时,出现该原因,简单来说就是:
由于开启了ONLY_FULL_GROUP_BY的设置,如果select 的字段不在 group by 中,
并且select 的字段未使用聚合函数(SUM,AVG,MAX,MIN等)的话,那么这条sql查询是被mysql认为非法的,会报错误…

解决方式:
执行sql

SET @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

上面对新建数据库有效,已存在数据库执行下面

SET sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

重启数据库需要重新执行上面语句。

取消 MySQL 中的 `sql_mode=only_full_group_by` 取决于你的具体需求和查询的语义。默认情况下,MySQL 开启 `ONLY_FULL_GROUP_BY` 模式,该模式要求在进行 GROUP BY 查询时,SELECT 列表中的列必须是 GROUP BY 列或者使用聚合函数进行计算的列。 如果你想取消 `ONLY_FULL_GROUP_BY` 模式,即使 SELECT 列表中的列不是 GROUP BY 列或者聚合函数的参数,也可以执行 GROUP BY 查询,可以通过以下两种方法之一来实现: 1. 临时取消:在你的查询语句前加上 `SET sql_mode=''`,将 `sql_mode` 设置为空字符串。这样会在当前会话中临时取消 `ONLY_FULL_GROUP_BY` 模式,只对当前查询语句有效。 ```sql SET sql_mode=''; SELECT column1, column2, ... FROM your_table GROUP BY column1; ``` 2. 永久取消:修改 MySQL 配置文件中的 `sql_mode` 参数。找到 MySQL 的配置文件(通常是 my.cnf 或 my.ini),在 [mysqld] 部分中添加或修改 `sql_mode` 参数,将其设置为空字符串。 ``` [mysqld] sql_mode='' ``` 然后重启 MySQL 服务使配置生效。这样会永久取消 `ONLY_FULL_GROUP_BY` 模式,对整个 MySQL 服务器的所有会话都生效。 需要注意的是,取消 `ONLY_FULL_GROUP_BY` 模式可能会导致某些查询产生不符合预期的结果,因为 GROUP BY 查询的语义会发生变化。在取消 `ONLY_FULL_GROUP_BY` 模式之前,建议先仔细检查你的查询语句,确保它们的语义和预期结果是一致的。 最后,建议根据你的具体需求来决定是否取消 `ONLY_FULL_GROUP_BY` 模式。如果你确定取消该模式不会引起问题,并且符合你的查询需求,那么可以采取上述方法取消该模式。 希望对你有所帮助,如果还有其他问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值