報錯的輸出:
[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
解決辦法:
1. 使用sql語句直接進行設定
檢視sql_mode,主要是看值是否有“only_full_group_by”值,目的把此值去掉
注意:隻設定global,需要重新連接配接進來才會生效
檢視目前連接配接會話的sql模式:
mysql> select @@session.sql_mode;
或者從環境變量裡取
mysql> show variables like "sql_mode";
檢視全局sql_mode設定:
mysql> select @@global.sql_mode;
隻設定global,需要重新連接配接進來才會生效
設定sql_mode
形式如
mysql> set sql_mode='';
mysql> set global sql_mode='NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES';
如果是自定義的模式組合,可以像下面這樣
Adding only one mode to sql_mode without removing existing ones:
mysql> SET sql_mode=(SELECT CONCAT(@@sql_mode,',<mode_to_add>'));
Removing only a specific mode from sql_mode without removing others:
mysql> SET sql_mode=(SELECT REPLACE(@@sql_mode,'<mode_to_remove>',''));
看不懂上面的可以先看這一句,或者直接執行這個依據進行全局設定sql_mode(設定之後需要重新開機mysql和重新連接配接)
2. 修改配置檔案my.cnf進行設定sql_mode去掉ONLY_FULL_GROUP_BY這個值
注意:此系統是用的ubuntn17.10的mysql,在配置的時候如果在my.cnf沒有找到該配置項,就去找該檔案includedir所指定的目錄去看一下引用的配置
sql_mode常用值說明
官方手冊專門有一節介紹。 SQL Mode 定義了兩個方面:MySQL應支援的SQL文法,以及應該在資料上執行何種确認檢查。
- SQL文法支援類
-
ONLY_FULL_GROUP_BY 對于GROUP BY聚合操作,如果在SELECT中的列、HAVING或者ORDER BY子句的列,沒有在GROUP BY中出現,那麼這個SQL是不合法的。是可以了解的,因為不在 group by 的列查出來展示會有沖突。
在5.7中預設啟用,是以在實施5.6更新到5.7的過程需要注意:
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column '1066export.ebay_order_items.TransactionID' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
- ANSI_QUOTES 啟用 ANSI_QUOTES 後,不能用雙引号來引用字元串,因為它被解釋為識别符,作用與 ` 一樣。設定它以後,update t set f1=”” …,會報 Unknown column ” in ‘field list 這樣的文法錯誤。
- PIPES_AS_CONCAT 将 || 視為字元串的連接配接操作符而非 或 運算符,這和Oracle資料庫是一樣的,也和字元串的拼接函數 CONCAT() 相類似。
- NO_TABLE_OPTIONS 使用 SHOW CREATE TABLE 時不會輸出MySQL特有的文法部分,如 ENGINE ,這個在使用 mysqldump 跨DB種類遷移的時候需要考慮。
- NO_AUTO_CREATE_USER 字面意思不自動建立使用者。在給MySQL使用者授權時,我們習慣使用 GRANT … ON … TO dbuser 順道一起建立使用者。設定該選項後就與oracle操作類似,授權之前必須先建立使用者。5.7.7開始也預設了。
-
- 資料檢查類
-
NO_ZERO_DATE 認為日期 ‘0000-00-00’ 非法,與是否設定後面的嚴格模式有關。
1. 如果設定了嚴格模式,則 NO_ZERO_DATE 自然滿足。但如果是 INSERT IGNORE 或 UPDATE IGNORE,’0000-00-00’依然允許且隻顯示warning
2. 如果在非嚴格模式下,設定了NO_ZERO_DATE,效果與上面一樣,’0000-00-00’允許但顯示warning;如果沒有設定NO_ZERO_DATE,no warning,當做完全合法的值。
3. NO_ZERO_IN_DATE情況與上面類似,不同的是控制日期和天,是否可為 0 ,即 2010-01-00 是否合法。
- NO_ENGINE_SUBSTITUTION 使用 ALTER TABLE或CREATE TABLE 指定 ENGINE 時, 需要的存儲引擎被禁用或未編譯,該如何處理。啟用NO_ENGINE_SUBSTITUTION時,那麼直接抛出錯誤;不設定此值時,CREATE用預設的存儲引擎替代,ATLER不進行更改,并抛出一個 warning .
-
STRICT_TRANS_TABLES 設定它,表示啟用嚴格模式。
注意 STRICT_TRANS_TABLES 不是幾種政策的組合,單獨指 INSERT、UPDATE出現少值或無效值該如何處理:
1. 前面提到的把 ” 傳給int,嚴格模式下非法,若啟用非嚴格模式則變成0,産生一個warning
2. Out Of Range,變成插入最大邊界值
3. A value is missing when a new row to be inserted does not contain a value for a non-NULL column that has no explicit DEFAULT clause in its definition
-
附LINUX系統操作MYSQL常用指令
1.終端啟動MySQL:/etc/init.d/mysql start;
登入MySQL:mysql -uroot -p (用root賬戶登入),然後輸入密碼;
檢視所有的資料庫名字:show databases;
4.選擇一個資料庫操作: use database_name;
5.檢視目前資料庫下所有的表名:show tables;
6.建立一個資料庫:create database database_name;
7.删除一個資料庫:drop database database_name;
8.建立一個表: create table mytest( uid bigint() not null, uname varchar() not null);
9.删除一個表: drop table mytest;
10.SQL插入語句:insert into table_name(col1,col2) values(value1,value2);
11.SQL更新語句:update table_name set col1='value1',col2='value2' where where_definition;
12.SQL查詢語句:select * from table_name where.......(最複雜的語句)
SQL删除語句:delete from table_name where...
增加表結構的字段:alert table table_name add column field1 date ,add column field2 time...
删除表結構的字段:alert table table_name drop field1;
16.檢視表的結構:show columns from table_name;
17.limit 的使用:select * from table_name limit ;//每頁隻顯示行 select * from table_name limit , //從查詢結果的第三個開始,顯示四項結果。 此處可很好的用來作分頁處理。
對查詢結果進行排序: select * from table_name order by field1,orderby field2;多重排序
19.退出MySQL:exit;
20.删除表中所有資料: truncate table 資料表名稱 (不可恢複)