MySQL 排錯-解決MySQL非聚合列未包含在GROUP BY子句報錯問題


排錯-解決MySQL非聚合列未包含在GROUP BY子句報錯問題

By:授客 QQ1033553122

 

測試環境

win10

MySQL 5.7

 

問題描述:

執行類似以下mysql查詢,

SELECT id, name, count(*) AS cnt FROM case_table GROUP BY name

報錯,如下:

服務器內部錯誤 (1055, "Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'case_table.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by")

 

原因:存在非聚合列 id ,沒有包含在GROUP BY子句中。

 

但是本例中,其它地方需要用到這個id列,不能去掉,那咋辦呢?如下

 

解決方法

方法1

查詢全局sql_mode

SELECT @@GLOBAL.sql_mode;

或者

SELECT @@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';
SET SESSION
 

 

 

復制查詢結果,然后設置GLOBAL sql_mode,SESSION sql_model為查詢結果去掉 “ONLY_FULL_GROUP_BY,”的值,如下:

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';

SET SESSION 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后,以上設置失效。

 

方法2

啟動mysql時,增加sql_model選項,如下:

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" [...其它選項]

 

方法3:

linux服務下,修改my.conf (Windows下修改my.ini),在[mysqld]節點下,最末尾添加sql_mode配置,如下:

...

[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

[其它節點配置]

...

 

 

 


免責聲明!

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



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