MySQL報錯1055 - Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated 解決方法


1、問題復現:

  今天在進行數據遷移時,使用Navicat連接數據庫進行連接時,由於 SQL語句中使用了 group by分組函數,結果報了如下錯誤:

2、產生原因

  產生原因說是,在MySQL數據庫版本為5.7以上的版本,默認開啟了 ONLY_FULL_GROUP_BY SQL模式,在此模式下,對於group by操作,如果在select語句中的查詢列沒有在group by中出現,那么這個SQL就是非法的,因為列不在group by語句中,所以設置了sql_mode=only_full_group_by的數據庫,在使用group by時就會報錯。

3、問題解決

  既然是 MySQL配置問題,找到了原因,就好對症下葯進行解決了。

方法一:

  在Navicat中,輸入下列SQL語句進行查詢:

SELECT @@GLOBAL.sql_mode;

  查詢結果如下:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

  通過上面的查詢結果,可以看到 開啟了 ONLY_FULL_GROUP_BY 模式,這里第一種解決方案就是,去除 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';

  執行完上面的SQL語句之后,再次執行報錯的SQL語句,發現可以正常運行了。

方法二:

  除了上面的手動設置sql_mode值之外,還可以在 MySQL 的配置文件中進行設置。

  1、對於 Linux系統,進到 /etc/my.cnf 文件下,查詢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

   添加完之后,保存退出,重啟 MySQL 即可生效。

  2、對於windows系統,進行 MySQL安裝目錄下,找到 my.ini 文件,同樣在配置文件中搜索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

   添加完畢之后,保存退出,然后重啟一下 MySQL 服務即可生效。

參考鏈接:

    https://www.cnblogs.com/52lnamp/p/9294330.html

    https://www.cnblogs.com/chancy/p/10026097.html


免責聲明!

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



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