MySQL [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause

MySQL[Err]1055

  • 上次MySQL5.7.19主從創建完成以後,全部的測試都是在MySQL命令行下進行的,最近用Navicat Premium進行MySQL的鏈接,而後在插入數據的時候MySQL忽然報錯了,但是個人數據插入成功了,感受很奇怪!!
    報錯內容以下:
[SQL]INSERT INTO biao(ziduan2) VALUES(8888888);
受影響的行: 1
時間: 0.012s

[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
  • 在知乎上找到了一個答案,貌似能夠解決問題
在my.cnf 裏面設置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 解決問題!

PS:但是依然不知道sql_mode是什麼?

這裏咱們先看一下MySQL5.6和MySQL5.7默認的sql模式

# MySQL 5.6 Default SQL_MODE;
mysql> select @@sql_mode;
+--------------------------------------------+
| @@sql_mode                                 |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.00 sec)
 
# MySQL 5.7 Default SQL_MODE;
mysql> select @@sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@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 |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql的sql_mode合理設置

  • mysql的sql_mode合理設置

sql_mode是個很容易被忽視的變量,默認值是空值,在這種設置下是能夠容許一些非法操做的,好比容許一些非法數據的插入。在生產環境必須將這個值設置爲嚴格模式,因此開發、測試環境的數據庫也必需要設置,這樣在開發測試階段就能夠發現問題html

sql_mode經常使用值以下:

  • ONLY_FULL_GROUP_BY

對於GROUP BY聚合操做,若是在SELECT中的列,沒有在GROUP BY中出現,那麼這個SQL是不合法的,由於列不在GROUP BY從句中。
在嚴格模式下,不要讓GROUP BY部分中的查詢指向未選擇的列,不然報錯。mysql

  • NO_AUTO_VALUE_ON_ZERO

該值影響自增加列的插入。默認設置下,插入0或NULL表明生成下一個自增加值。若是用戶 但願插入的值爲0,而該列又是自增加的,那麼這個選項就有用了。sql

  • STRICT_TRANS_TABLES

在該模式下,若是一個值不能插入到一個事務表中,則中斷當前的操做,對非事務表不作限制數據庫

  • NO_ZERO_IN_DATE

在嚴格模式下,不容許日期和月份爲零oracle

  • NO_ZERO_DATE

設置該值,mysql數據庫不容許插入零日期,插入零日期會拋出錯誤而不是警告。函數

  • ERROR_FOR_DIVISION_BY_ZERO

在INSERT或UPDATE過程當中,若是數據被零除,則產生錯誤而非警告。如 果未給出該模式,那麼數據被零除時MySQL返回NULL測試

  • NO_AUTO_CREATE_USER

禁止GRANT建立密碼爲空的用戶this

  • NO_ENGINE_SUBSTITUTION

若是須要的存儲引擎被禁用或未編譯,那麼拋出錯誤。不設置此值時,用默認的存儲引擎替代,並拋出一個異常命令行

  • PIPES_AS_CONCAT

將"||"視爲字符串的鏈接操做符而非或運算符,這和Oracle數據庫是同樣的,也和字符串的拼接函數Concat相相似code

  • ANSI_QUOTES

啓用ANSI_QUOTES後,不能用雙引號來引用字符串,由於它被解釋爲識別符

ORACLE的sql_mode設置等同:PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER.

若是使用mysql,爲了繼續保留你們使用oracle的習慣,能夠對mysql的sql_mode設置以下:

在my.cnf添加以下配置
[mysqld]
sql_mode='ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,

ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT,ANSI_QUOTES'

PS:參考自:http://www.cnblogs.com/grimm/p/5752259.html,http://www.ywnds.com/?p=8865

相關文章
相關標籤/搜索