ONLY_FULL_GROUP_BY是MySQL提供的一個(gè)sql_mode,通過這個(gè)sql_mode來提供SQL語句GROUP BY合法性的檢查,在MySQL的sql_mode是非ONLY_FULL_GROUP_BY語義時(shí)。一條select語句,MySQL允許target list中輸出的表達(dá)式是除聚集函數(shù)或group by column以外的表達(dá)式,這個(gè)表達(dá)式的值可能在經(jīng)過group by操作后變成undefined。
一般方式
1、查看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
2、去掉ONLY_FULL_GROUP_BY,重新設(shè)置值。
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';
3、上面是改變了全局sql_mode,對(duì)于新建的數(shù)據(jù)庫有效。對(duì)于已存在的數(shù)據(jù)庫,則需要在對(duì)應(yīng)的數(shù)據(jù)下執(zhí)行:
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';
廢話半天,但是其實(shí)同事和我本地這樣設(shè)置都沒有生效。
大家都明白,工具里面修改一般是臨時(shí)的,只有修改配置文件才是永久的,但是比如在同事電腦上參考好幾種網(wǎng)絡(luò)上的說法修改了/etc/my.cnf文件,也還是沒有奏效。
windows 在安裝目錄下的my.ini 文件
Mac 或者Linux 在/ etc/my.cnf 下面應(yīng)該是
總之就是在個(gè)人mysql配置文件中修改。
另一個(gè)方式
最后沒辦法了,下面的命令卻不小心達(dá)到了目的,特此記錄一下。
SET @@sql_mode=REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', '');