問題提出
MySQL數據表查詢語句:
select * from t_user where sex = 0 group by home_address having count(id)>0;
提示如下錯誤信息:
[42000][1055] Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'spb-db.t_user.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
t_user表的定義如下:
create table t_user
(
id bigint auto_increment primary key,
created_by varchar(255) null,
created_time datetime null,
updated_by varchar(255) null,
updated_time datetime null,
version bigint null,
age int null,
home_address varchar(255) null,
name varchar(255) not null,
phone varchar(255) null,
sex int null,
birth_day date null,
constraint my_index_name
unique (name)
)
MySQL信息
在MySQL命令行或者控制檯輸入指令:
select @@version
輸出: 8.0.19
select @@global.sql_mode
輸出:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
原因分析:
MySQL 5.7.5及以上功能依賴檢測功能。如果啓用了ONLY_FULL_GROUP_BY SQL模式(默認情況下),MySQL將拒絕選擇列表。
參考文檔: http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-setting
在文檔指出:ONLY_FULL_GROUP_BY的設定,將不允許查詢字段包括非聚集列。
5.7.5之前,MySQL沒有檢測到功能依賴關係,默認情況下不啓ONLY_FULL_GROUP_BY.
only_full_group_by
only_full_group_by:select的列都要在group中,或者本身是聚合列(SUM,AVG,MAX,MIN) 才行,其實這個配置和distinct差不多的.
例如在默認開啓only_full_group_by設置下:
select home_address, count(id) from t_user where sex = 0 group by home_address having count(id)>0;
其中home_address爲group 分組中的column。 id使用了聚集函數count,所以它們是有效的。
關閉這個設置
在MySQL命令行或控制檯執行指令:
set @@global.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
檢查一下是否設置成功:
select @@global.sql_mode
看看ONLY_FULL_GROUP_BY是否消失。