環境:mysql-8.0.15-winx64
問題描述:
Error querying database. Cause: java.sql.SQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'tt.from_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
關於葉神的頭條資訊網站項目,自己在練習時,寫了一個站內信,卻一直獲取站內信列表失敗。前后對照代碼都沒錯,很是急人!然后用MySQL workbench圖示化出來發現,在寫以下SQL語句時就出現了錯誤。對照着IDEA上的出錯警示(下圖1所示)
SELECT * FROM message group by conversation_id;
圖1. IDEA上的出錯警示
果然是DAO層的SQL語句出現了問題。但是我回過頭來看,再三檢查,發現明明沒有問題呢【黑人問號臉】,於是百度搜索,發現真有不少相關的問題。
原來代碼沒錯,是數據庫的sql_mode出了問題。
參照參考2中解釋【真心詳細】,SQL模式默認情況下是only_full_group_by ,MySQL就會拒絕選擇列表、條件或順序列表引用的查詢,這些查詢將引用組中未命名的非聚合列,而不是在功能上依賴於它們。
為了一探究竟,於是乎,先后照着執行以下命令:
SHOW SESSION VARIABLES;
SHOW GLOBAL VARIABLES;
select @@sql_mode;
可見:session和global 的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中解決辦法操作時,在命令行發現出現了問題
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';
發現提示sql_mode不能被賦值為NO_AUTO_CREATE_USER,操作了一下set session sql_mode,也是同樣的問題。
於是乎,那不行就不行唄,將NO_AUTO_CREATE_USER刪去了,再次賦值。果然成功!
正確執行命令是:
set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
這兩個命令是去掉 sql_mode 的 ONLY_FULL_GROUP_BY模式的。故有效果。
另外,我還試了參考1中的辦法,就是高贊的答案,執行如下:
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
然后發現也是不行,所以建議大家還是采用參考2中的方法吧!
參考:
2. 極力推薦:https://blog.csdn.net/fansili/article/details/78664267