mysql报错;this is incompatible with sql_mode=only_full_group_by

目录

问题:

解决方法

方法 1:调整 SQL 查询

方法 2:使用聚合函数

方法 3:禁用 ONLY_FULL_GROUP_BY 模式

方法 4:检查 Spring 配置

推荐的解决方法


问题:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'xxxx' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

这个错误是由于你的 SQL 查询违反了 MySQL 的 ONLY_FULL_GROUP_BY 模式。具体来说,SELECT 子句中包含了一个非聚合列(bpm_app.gwfp_field_template_attr.ID),但该列没有出现在 GROUP BY 子句中,这导致了语法错误。

解决方法

方法 1:调整 SQL 查询

修改查询,确保所有非聚合列都出现在 GROUP BY 子句中。例如:

SELECT gwfp_field_template_attr.ID, column2, SUM(column3)
FROM bpm_app.gwfp_field_template_attr
GROUP BY gwfp_field_template_attr.ID, column2;
方法 2:使用聚合函数

如果你不需要 gwfp_field_template_attr.ID 的具体值,而是希望选择某个特定值(如最大值或最小值),可以使用聚合函数。例如:

SELECT MAX(gwfp_field_template_attr.ID) AS ID, column2, SUM(column3)
FROM bpm_app.gwfp_field_template_attr
GROUP BY column2;
方法 3:禁用 ONLY_FULL_GROUP_BY 模式

如果你确定查询逻辑是正确的,并且理解禁用 ONLY_FULL_GROUP_BY 的潜在风险,可以通过以下方式禁用它:

临时禁用(当前会话):

SET sql_mode = REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', '');

永久禁用(全局设置):

        编辑 MySQL 配置文件(my.cnfmy.ini),找到或添加以下内容

[mysqld]
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 命令修改

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';
方法 4:检查 Spring 配置

如果你使用的是 Spring Boot,可以在 application.propertiesapplication.yml 文件中配置 SQL 模式:

        

spring.datasource.url=jdbc:mysql://localhost:3306/your_database?
useSSL=false&serverTimezone=UTC&sessionVariables=sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

推荐的解决方法

优先推荐方法 1,即调整 SQL 查询,确保所有非聚合列都出现在 GROUP BY 子句中。这种方法符合 SQL 标准,并且避免了潜在的数据一致性问题。

如果你确实需要使用非聚合列的值,并且理解禁用 ONLY_FULL_GROUP_BY 的风险,可以选择方法 3 或方法 4。但请注意,禁用 ONLY_FULL_GROUP_BY 可能导致查询结果的不确定性,因为 MySQL 会选择分组中的任意值作为结果。

如果你选择禁用 ONLY_FULL_GROUP_BY,请确保在开发和生产环境中保持一致的配置,以避免意外的错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java皇帝

有帮助就赏点吧,博主点杯水喝喝

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值