一、前言
最近老项目换新数据库(都是mysql),有些在老数据库可以执行的sql,在新数据库执行就会报错,如下:
[sql]select * from bsc_user_t a group by user_name limit 100 [err] 1055 - expression #1 of select list is not in group by clause and contains nonaggregated column 'otp.a.id' which is not functionally dependent on columns in group by clause; this is incompatible with sql_mode=only_full_group_by
意思是说数据库的模式是sql_mode=only_full_group_by
,group by的字段必须和查询字段一致才行,否则不让执行,例如:
select user_name from bsc_user_t a group by user_name limit 100
但是这样不太能符合原本需要的功能,而且老项目有很多这样的不标准语句,都改不现实。
二、解决方法
修改数据库配置。搜到2种方法:
1.临时关闭only_full_group_by模式
(1)先查看自己的数据库是怎么配置的:
show variables like 'sql_mode'; only_full_group_by,strict_trans_tables,no_zero_in_date,no_zero_date,error_for_division_by_zero,no_auto_create_user,no_engine_substitution
(2)然后,把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';
(3)注意这种方法,重启mysql后会失效
2.永久关闭only_full_group_by模式
(1) 找到配置文件/etc/my.cnf(或则关联文件夹找到mysql-server.cnf)
(2) 找到当前配置的sql_mode
那行,去掉only_full_group_by
;
如果没有,就在文件内的[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'
(3)保存配置文件后,重启mysql。
三、备注
本人执行
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';
报错了:
[err] 1227 - access denied; you need (at least one of) the super privilege(s) for this operation
说明当前用户没有权限;需要联系管理员执行才行;
改服务器配置也同理,如果没有权限,联系管理员。
总结
到此这篇关于执行sql报错only_full_group_by的2种解决方法的文章就介绍到这了,更多相关执行sql报错only_full_group_by内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论