前言:
在做項目的時候因為本地開發(fā)環(huán)境MySQL版本是5.5版本,而線上環(huán)境的MySQL版本是5.7.3版本的
我們要查詢的SQL語句
--不規(guī)范的SQL語句(錯誤)
SELECT *,COUNT(1) AS COUNT FROM stepsrecord WHERE steps>1000 GROUP BY steps,uid HAVING COUNT>1;
在我們部署到線上環(huán)境的去訪問的項目的時候報錯了
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'many_steps.stepsrecord.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
從字面意思理解是:select后面查詢的字段沒有出現(xiàn)在group by中。
MySQL在5.7.x版本以下是允許select后面的聚合函數(shù)出現(xiàn)未聲明的字段(換句話來說就是select后面要查詢的字段可以和group by 后面聲明的字段不對應)
解決方案:
- 修改SQL語句使其遵守only_full_group_by規(guī)則(推薦使用)
-- 舉例說明:
select a,b from table group by a,b,c; --(正確)
select a,b,c from table group by a,b; --(錯誤)
所以我們要修改查詢語句,使得前后一致就可以了榨了。
--不規(guī)范的SQL語句(錯誤)
SELECT *,COUNT(1) AS COUNT FROM stepsrecord WHERE steps>1000 GROUP BY steps,uid HAVING COUNT>1;
-- 規(guī)范的SQL語句(正確)
SELECT steps,uid,COUNT(1) AS COUNT FROM stepsrecord WHERE steps>1000 GROUP BY steps,uid HAVING COUNT>1;
- 降級MySQL版本江锨,使其版本小于5.7版本(不推薦)
第一闻牡、現(xiàn)在mysql版本都已經(jīng)8.0版本了盗似,如果環(huán)境允許還是要向新版本靠攏,只要不斷學習新的東西才能進步沥邻。
第二危虱、5.7版本only_full_group_by規(guī)則的出現(xiàn)就有其存在的意義,這里我們不做深究唐全。 - 關(guān)閉only_full_group_by規(guī)則(不推薦)
理由:我看網(wǎng)上很多解決辦法都是這種埃跷,關(guān)閉其規(guī)則校驗。不管是執(zhí)行set sql_mode還是修改my.cnf文件都需要重啟mysql服務芦瘾。
注意:如果使用set sql_mode關(guān)閉規(guī)則捌蚊,重啟mysql服務會重置規(guī)則集畅,需要重新設(shè)置近弟。
sql_mode 配置解析
-
重點:ONLY_FULL_GROUP_BY
對于GROUP BY聚合操作,如果在SELECT中的列挺智,沒有在GROUP BY中出現(xiàn)祷愉,那么這個SQL是不合法的,因為列不在GROUP BY從句中赦颇。簡而言之二鳄,就是SELECT后面接的列必須被GROUP BY后面接的列所包含。如:
-- 舉例說明:
select a,b from table group by a,b,c; --(正確)
select a,b,c from table group by a,b; --(錯誤)
NO_AUTO_VALUE_ON_ZERO
該值影響自增長列的插入媒怯。默認設(shè)置下订讼,插入0或NULL代表生成下一個自增長值。(不信的可以試試扇苞,默認的sql_mode你在自增主鍵列設(shè)置為0欺殿,該字段會自動變?yōu)樽钚碌淖栽鲋担Ч蚽ull一樣)鳖敷,如果用戶希望插入的值為0(不改變)脖苏,該列又是自增長的,那么這個選項就有用了定踱。STRICT_TRANS_TABLES
在該模式下棍潘,如果一個值不能插入到一個事務表中,則中斷當前的操作,對非事務表不做限制亦歉。(InnoDB默認事務表恤浪,MyISAM默認非事務表;MySQL事務表支持將批處理當做一個完整的任務統(tǒng)一提交或回滾肴楷,即對包含在事務中的多條語句要么全執(zhí)行资锰,要么全部不執(zhí)行。非事務表則不支持此種操作阶祭,批處理中的語句如果遇到錯誤绷杜,在錯誤前的語句執(zhí)行成功,之后的則不執(zhí)行濒募;MySQL事務表有表鎖與行鎖非事務表則只有表鎖)NO_ZERO_IN_DATE
在嚴格模式下鞭盟,不允許日期和月份為零NO_ZERO_DATE
設(shè)置該值,mysql數(shù)據(jù)庫不允許插入零日期瑰剃,插入零日期會拋出錯誤而不是警告齿诉。ERROR_FOR_DIVISION_BY_ZERO
在INSERT或UPDATE過程中,如果數(shù)據(jù)被零除晌姚,則產(chǎn)生錯誤而非警告粤剧。如 果未給出該模式,那么數(shù)據(jù)被零除時MySQL返回NULLNO_AUTO_CREATE_USER
禁止GRANT創(chuàng)建密碼為空的用戶NO_ENGINE_SUBSTITUTION
如果需要的存儲引擎被禁用或未編譯挥唠,那么拋出錯誤抵恋。不設(shè)置此值時,用默認的存儲引擎替代宝磨,并拋出一個異常PIPES_AS_CONCAT
將”||”視為字符串的連接操作符而非或運算符弧关,這和Oracle數(shù)據(jù)庫是一樣的,也和字符串的拼接函數(shù)Concat相類似ANSI_QUOTES
啟用ANSI_QUOTES后唤锉,不能用雙引號來引用字符串世囊,因為它被解釋為識別符
感覺有用的同學,動動小手指給個贊窿祥,碼字不易株憾。