天天看點

mysql 5.7 full_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屬性值

mysql 5.7 full_MySQL5.7預設打開ONLY_FULL_GROUP_BY 解決方案

複制查詢結果,去掉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,伺服器重新開機後,設定可能會失效。

解決方案二:

修改my.ini 檔案

[mysql] [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'

解決方案三:

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拒絕。