解決mysql5.7版本因爲sql_mode設置導致的一些問題

因爲重新安裝了環境,想把之前的數據庫導入到新庫裏面,結果就報瞭如下錯誤:[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”

嘗試解決

  • 方法一
    登錄mysql,設置sql_mode
    use mysql;
    set sql_mode=‘NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES’;
    然而並沒有什麼卵用
  • 方法二
    原來上邊的設置方法只是會話級別的設置,真正讓他生效得修改配置文件:
    vi /etc/my.cnf
    在[mysqld]配置項下面加上:
    sql_mode=NO_UNSIGNED_SUBTRACTION,NO_ENGINE_SUBSTITUTION
    重啓服務,
    再進入mysql
    show variables like ‘sql_mode’;
    設置成功啦!!

關於sql_mode

官方文檔:https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html

重要的幾項配置簡單介紹,更多詳細介紹移步官方文檔

NO_ENGINE_SUBSTITUTION 使用 ALTER TABLE或CREATE TABLE 指定 ENGINE 時, 需要的存儲引擎被禁用或未編譯,該如何處理。啓用NO_ENGINE_SUBSTITUTION時,那麼直接拋出錯誤;不設置此值時,CREATE用默認的存儲引擎替代,ATLER不進行更改,並拋出一個 warning .

STRICT_TRANS_TABLES 設置它,表示啓用嚴格模式。
注意 STRICT_TRANS_TABLES 不是幾種策略的組合,單獨指 INSERT、UPDATE出現少值或無效值該如何處理:
例如:
如果我們建表的時候不嚴格,比如字段設置是NOT NULL,然而並沒有給字段設置默認值,在插入語句的時候,這個字段我們忽略,沒有賦值,恰好這個時候mysql的sql_mode是嚴格模式,即啓用了STRICT_TRANS_TABLES,就會報字段沒有默認值的錯誤。
或者說,我們將空字符串賦值給int類型的字段,在嚴格模式下也會報同樣的錯誤。如果sql_mode沒有配置STRICT_TRANS_TABLES則不會報錯

ONLY_FULL_GROUP_BY 對於GROUP BY聚合操作,如果在SELECT中的列、HAVING或者ORDER BY子句的列,沒有在GROUP BY中出現,那麼這個SQL是不合法的。因爲不在 group by 的列查出來展示會有矛盾。
例如:
SELECT id from conf_merchant GROUP BY merchant_id;
這條sql在ONLY_FULL_GROUP_BY模式下就會報錯。
1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘iapw.conf_merchant.market_id’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

如果sql_mode 沒有配置ONLY_FULL_GROUP_BY,就不會報錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章