MySQL5.7默認打開ONLY_FULL_GROUP_BY模式問題與解決方案


MySQL5.7后將sql_mode的ONLY_FULL_GROUP_BY模式默認設置為打開狀態,這樣一來,很多之前的sql語句可能會出現錯誤,錯誤信息如下:

Error Code: 1055. Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column '×××' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

描述:select的列都要在group中,或許本身是聚合列(SUM,AVG,MAX,MIN)才行

解決方案一:

這時我們可以通過navicat或workbench輸入select @@global.sql_mode來查看當前數據庫的sql_mode屬性值

復制查詢結果,去掉ONLY_FULL_GROUP_BY,重新賦值,執行成功后,就可以將ONLY_FULL_GROUP_BY模式默認設置為關閉狀態,解決之前的sql報錯問題

set 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_model,服務器重啟后,設置可能會失效。設置永久生效模式可參考博客:https://www.cnblogs.com/zenghui940/p/4361941.html

 

解決方案二:

MySQL有any_value(field)函數,他主要的作用就是抑制ONLY_FULL_GROUP_BY值被拒絕

官方有介紹,地址:https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_any-value

我們可以把select語句中查詢的屬性(除聚合函數所需的參數外),全部放入any_value(field)函數中;

例如:select name,any_value(sex) from test_table group by name

這樣sql語句不管是在ONLY_FULL_GROUP_BY模式關閉狀態還是在開啟模式都可以正常執行,不被mysql拒絕。

 

本人小白,如果表述的難以理解可查看博客:http://www.ywnds.com/?p=8184

 

原文地址:https://blog.csdn.net/Peacock__/article/details/78923479


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM