在使用mysql是在navicat中查詢一條簡(jiǎn)單語句使用了 select * from table 雖然查詢成功了,但是報(bào)了
網(wǎng)站設(shè)計(jì)制作過程拒絕使用模板建站;使用PHP+MYSQL原生開發(fā)可交付網(wǎng)站源代碼;符合網(wǎng)站優(yōu)化排名的后臺(tái)管理系統(tǒng);網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)收費(fèi)合理;免費(fèi)進(jìn)行網(wǎng)站備案等企業(yè)網(wǎng)站建設(shè)一條龍服務(wù).我們是一家持續(xù)穩(wěn)定運(yùn)營了十載的創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司。
[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by 錯(cuò)誤.
在MySQL5.7之后,sql_mode中默認(rèn)存在ONLY_FULL_GROUP_BY,SQL語句未通過ONLY_FULL_GROUP_BY語義檢查所以報(bào)錯(cuò)。
ONLY_FULL_GROUP_BY模式要求select語句中查詢出來的列必須是明確的(其他語句也是一樣)。
以SQL語句 select columes from table group by list 為例:columns必須是聚集函數(shù)或者在group by后的表達(dá)式list中,并且list中必須包含主鍵,否則也會(huì)報(bào)錯(cuò)。
insert、update、delete語句都會(huì)報(bào)錯(cuò)(但不影響SQL語句的執(zhí)行),因?yàn)檫@三種語句執(zhí)行之前也會(huì)執(zhí)行查詢操作。
以主鍵為id的表為例:
執(zhí)行sql語句使sql_mode的模式去掉ONLY_FULL_GROUP_BY,但是重啟服務(wù)會(huì)失效
注意: 在ubuntu 18中的mysql配置文件需要修改 mysqld.cnf , 其他系統(tǒng)的其他mysql版本需要根據(jù)特定情況查找需要修改的配置文件,如:windows中一般是 my.ini ,linux中可能是 my.cnf
在[mysqld]下面增加如下內(nèi)容
驗(yàn)證: 再次在navicat中 select * from table 查詢,已沒有錯(cuò)誤.
在第一個(gè)創(chuàng)建語句后面改成 Create Table sys_action if not exists即可,這樣可以防止出錯(cuò)
在Create Table 后面加上if not exists 即可避免類似的錯(cuò)誤
或者是Create or Replace
錯(cuò)誤代碼1055。不過看了Expression里面的原因描述,我基本知道怎么回事了。原因是因?yàn)閙ysql中對(duì) group by 用法的規(guī)定。嚴(yán)格意義上說,就是group by之后。select 的字段只能是group by的字段?;蛘咝枰泳酆虾瘮?shù)的。在 oracle 中,一直有這項(xiàng)約定。所以直接就會(huì)報(bào)錯(cuò)。但是mysql 直到 5.7 版本之后才把這個(gè)要求明確限制起來。
很明顯,這種問題兩種思路:第一修改sql。按照規(guī)定的規(guī)范重寫項(xiàng)目中所有有問題的sql。很明顯代價(jià)太大。風(fēng)險(xiǎn)很高;第二種那就是把這種限制去掉,讓功能繼續(xù)像5.7之前的樣子一樣能跑。我果斷選擇了第二種。因?yàn)榈谝环N代價(jià)太大。
解決辦法:
1. 首先如何查看當(dāng)前數(shù)據(jù)庫使用的sql_mode:
select?@@sql_mode;?
2.?修改mysql的配置文件,刪掉only_full_group_by這一項(xiàng)
注意:Mac:Mysql默認(rèn)安裝在/usr/local目錄下,這個(gè)目錄可以通過command+shift+G進(jìn)入:如下圖
windows下是的配置文件是my.ini,自己可以找一下。
問題解決完了,然后剩下兩個(gè)問題:
1. mysql里面的?sql_mode 一共有哪些,并且mode的值各自代表什么含義。在網(wǎng)上查詢了一下,結(jié)果如下:
MySQL5.0以上版本支持三種sql_mode模式:ANSI、TRADITIONAL和STRICT_TRANS_TABLES
1、ANSI模式:寬松模式,更改語法和行為,使其更符合標(biāo)準(zhǔn)SQL。對(duì)插入數(shù)據(jù)進(jìn)行校驗(yàn),如果不符合定義類型或長度,對(duì)數(shù)據(jù)類型調(diào)整或截?cái)啾4?,?bào)warning警告。對(duì)于本文開頭中提到的錯(cuò)誤,可以先把sql_mode設(shè)置為ANSI模式,這樣便可以插入數(shù)據(jù),而對(duì)于除數(shù)為0的結(jié)果的字段值,數(shù)據(jù)庫將會(huì)用NULL值代替。
將當(dāng)前數(shù)據(jù)庫模式設(shè)置為ANSI模式:切換到mysql命令下執(zhí)行:set @@sql_mode=ANSI; ?
2、TRADITIONAL模式:嚴(yán)格模式,當(dāng)向mysql數(shù)據(jù)庫插入數(shù)據(jù)時(shí),進(jìn)行數(shù)據(jù)的嚴(yán)格校驗(yàn),保證錯(cuò)誤數(shù)據(jù)不能插入,報(bào)error錯(cuò)誤,而不僅僅是警告。用于事物時(shí),會(huì)進(jìn)行事物的回滾。 注釋:一旦發(fā)現(xiàn)錯(cuò)誤立即放棄INSERT/UPDATE。如果你使用非事務(wù)存儲(chǔ)引擎,這種方式不是你想要的,因?yàn)槌霈F(xiàn)錯(cuò)誤前進(jìn)行的數(shù)據(jù)更改不會(huì)“滾動(dòng)”,結(jié)果是更新“只進(jìn)行了一部分”。
將當(dāng)前數(shù)據(jù)庫模式設(shè)置為TRADITIONAL模式:切換到mysql命令下執(zhí)行:set @@sql_mode=TRADITIONAL;
3、STRICT_TRANS_TABLES模式:嚴(yán)格模式,進(jìn)行數(shù)據(jù)的嚴(yán)格校驗(yàn),錯(cuò)誤數(shù)據(jù)不能插入,報(bào)error錯(cuò)誤。如果不能將給定的值插入到事務(wù)表中,則放棄該語句。對(duì)于非事務(wù)表,如果值出現(xiàn)在單行語句或多行語句的第1行,則放棄該語句。
將當(dāng)前數(shù)據(jù)庫模式設(shè)置為STRICT_TRANS_TABLES模式:切換到mysql命令下執(zhí)行:set @@sql_mode=STRICT_TRANS_TABLES; ?
對(duì)于GROUP BY聚合操作,若select中的列沒有在group by中出現(xiàn),那么這句SQL是不合法的。
解決辦法下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'
在sql_mode 中去掉only_full_group_by
然后重啟MySQL Server即可。