在使用mysql group分組時 出現sql_mode=only_full_group_by 錯誤
查了網上 都是說 設定sql_mode值
在配置檔案中修改
windows 在安裝目錄下的my.ini 檔案
Mac 或者Linux 在/ etc/my.cnf
在[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
那麼設定這段到底是什麼意思呢?
各項的含義如下:
STRICT_TRANS_TABLES:
在該模式下,如果一個值不能插入到一個事務表中,則中斷目前的操作,對非事務表不做限制。必須設定,以後各項可能依賴于該項的設定
NO_ENGINE_SUBSTITUTION:
如果需要的存儲引擎被禁用或未編譯,那麼抛出錯誤。不設定此值時,用預設的存儲引擎替代,并抛出一個異常
ONLY_FULL_GROUP_BY:
對于GROUP BY操作,如果在SELECT中出現的單獨的列,沒有在GROUP BY子句中出現,那麼這個SQL是不合法的
NO_AUTO_VALUE_ON_ZERO:
該值影響自增長列的插入。預設設定下,插入0或NULL代表生成下一個自增長值。如果使用者希望插入的值為0,而該列又是自增長的,那麼這個選項就有用了
NO_ZERO_IN_DATE:
在嚴格模式下,不允許日期和月份為零
NO_ZERO_DATE:
設定該值,mysql資料庫不允許插入零日期,插入零日期會抛出錯誤而不是警告
ERROR_FOR_DIVISION_BY_ZERO:
在INSERT或UPDATE過程中,如果資料被零除,則産生錯誤而非警告。如果未給出該模式,那麼資料被零除時MySQL傳回NULL
NO_AUTO_CREATE_USER:
禁止GRANT語句建立密碼為空的使用者
PIPES_AS_CONCAT:
将“||”視為字元串的連接配接操作符而非或運算符,這和Oracle資料庫是一樣的,也和字元串的拼接函數Concat相類似
ANSI_QUOTES:
啟用ANSI_QUOTES後,不能用雙引号來引用字元串,因為它被解釋為識别符
其中ONLY_FULL_GROUP_BY錯誤 主要是在select後得字段未在group by 子句中出現
也就是說是咱寫得sql有問題,而不是配置檔案得原因,既然有這個限制 那麼就證明 尤其存在意義,配置檔案盡可能得不去修改(當然僅針對我這種小白)。
那麼既然知道是我們SQL得問題 我們就需要去修改自己得sql 可嘗試在gourp by 子句後添加要查詢得字段
例如:
select count(id),typeValue,typeName from dev group by typeValue
那麼隻需要在 後面添加 typeName字段即可
select count(id),typeValue,typeName from dev group by typeValue,typeName
如果不能執行,那麼就需要自己好好審讀自己得sql,如果着急 可先使用上面得配置方案解決,後續有時間再更改。