广州办公家具定制 发表于 2024-11-26 08:54:22

如何解决MySQL this is incompatible with sql_mode=only_full_group_

MySQL this is incompatible with sql_mode=only_full_group_by


代码示例:
在MySQL中,ONLY_FULL_GROUP_BY 是一个SQL模式设置,它要求在使用GROUP BY时,SELECT语句中引用的所有列必须在GROUP BY子句中明确指定,或者是聚合函数的一部分。
这个模式的目的是为了防止产生不确定的查询结果。
如果你遇到了ONLY_FULL_GROUP_BY的错误,以下是一些解决方案:

1.修改SQL语句


[*]确保SELECT列表中的所有列要么包含在GROUP BY子句中,要么作为聚合函数的一部分。
[*]例如,如果你的查询是这样的:
SELECT column1, column2 FROM table GROUP BY column1;

[*]你需要将column2也加入到GROUP BY子句中
[*]或者对column2使用聚合函数
[*]如MAX(column2)或SUM(column2)

2.使用聚合函数


[*]对于SELECT列表中不在GROUP BY子句中的列
[*]可以使用聚合函数,如MAX(), MIN(), SUM(), COUNT()等

3.禁用ONLY_FULL_GROUP_BY


[*]你可以在会话级别或全局级别禁用ONLY_FULL_GROUP_BY。
[*]这可以通过以下命令完成:
SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

[*]或者,你可以修改MySQL的配置文件(例如my.cnf或my.ini)
[*]去掉ONLY_FULL_GROUP_BY:

sql_mode = NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

[*]修改配置文件后,需要重启MySQL服务以使更改生效。

4.使用ANY_VALUE()函数


[*]ANY_VALUE()函数可以用来选择每个分组的任意值
[*]这在某种程度上可以绕过ONLY_FULL_GROUP_BY的限制

5.永久修改sql_mode


[*]在某些情况下,如果你不希望每次重启MySQL服务后都要重新设置sql_mode,你可以将更改永久化到MySQL的配置文件中。
[*]请注意,禁用ONLY_FULL_GROUP_BY可能会让你的查询结果变得不确定,因为MySQL将不再强制要求GROUP BY子句包含所有非聚合列。
[*]因此,在禁用这个模式之前,最好先评估一下它对你的查询逻辑和结果的影响。
如果你正在使用MySQL 8.0或更高版本,并且尝试修改sql_mode时遇到了问题,比如出现了错误:
ERROR 1231 (42000): Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER'

[*]这是因为在MySQL 8.0及以上版本中,NO_AUTO_CREATE_USER已经被移除。
[*]在这种情况下,你需要从sql_mode中移除这个值。
[*]在处理这个问题时,建议先尝试修改SQL语句以符合ONLY_FULL_GROUP_BY的要求,因为这是最安全的做法,可以避免潜在的数据一致性问题。
[*]如果这不可能或者不切实际,那么再考虑禁用ONLY_FULL_GROUP_BY。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

来源:https://www.jb51.net/database/331030kab.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 如何解决MySQL this is incompatible with sql_mode=only_full_group_