背景
MySQL在版本升級到5.7之后,對于 Sql_mode,默認開啟了ONLY_FULL_GROUP_BY,要求對于 SELECT 語句中的非聚合列(沒有在 GROUP BY 子句中出現(xiàn))使用聚合函數(shù)。
常見問題
對于老版本,有些不規(guī)范的SQL語句,在升級后,會出現(xiàn)報錯現(xiàn)象。
In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'tiansense_cxqy.u.UserName'; this is incompatible with sql_mode=only_full_group_by
對應SQL如下:
SELECT userid,username,max(age) from class group by userid
解決方法
那對于這種問題,我們通常有三種處理方案。
1,修改參數(shù),重啟服務
sql-mode屬于靜態(tài)參數(shù),必須重啟服務。
在配置文件中,找到sql-mode的位置,去掉ONLY_FULL_GROUP_BY,然后需要重啟mysql 服務。
2,修改SQL語句
把業(yè)務中不規(guī)范的SQL,修改為規(guī)范的格式后,重新發(fā)布業(yè)務。
3,修改數(shù)據(jù)庫臨時變量
在會話級別去掉ONLY_FULL_GROUP_BY參數(shù),但是這種方案只適合人工會話級別查詢使用。線上業(yè)務無法處理。
set sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
不同的場景,要采取不同的方案。
正常情況下,我們要跟業(yè)務溝通,采取第二種方案。因為本身這種不規(guī)范的SQL,查詢的結果也不準確。