發現5.6和5.7版本的創建表不一致,從5.6導出數據表創建sql文件,然后導入到5.7表會報錯,timestamp不能為空
查看的sql_mode
mysql5.0以上支持的三種模式
1. ANSI
2. TRADITIONAL
3. STRICT_TRANS_TABLES
ANSI模式:寬松模式
對插入數據進行校驗,如果不符合定義類型或長度,對數據類型調整或截斷保存,報warning警告。
對於除數為0的結果的字段,會用NULL值代替。
TRADITIONAL模式:嚴格模式
當向mysql數據庫插入數據時,進行數據的嚴格校驗,保證錯誤數據不能插入,報error錯誤。
用於事務時,會進行事務的回滾。使用非事務存儲引擎,出現錯誤前進行的數據更改不會回滾,
結果是只更新的一部分
STRICT_TRANS_TABLES模式:嚴格模式
進行數據的嚴格校驗,錯誤數據不能插入,報error錯誤。
如果不能將值插入到事務表中,則進行回滾。
對於非事務表,如果值出現在單行語句或多行語句的第1行,則放棄該語句。
注:
Myisam不支持事務,非事務存儲引擎
Innodb支持事務,事務存儲引擎
事務表(TST)和非事務表 (NTST)
支持的sql語法模式
執行sql命令可以查看sql模式
select @@sql_mode STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
在嚴格模式下,會檢查sql的語法,如果不通過則會直接報錯
比如下面的字段定義,設置時間戳timestamp默認為null,會直接報錯
`create_time` TIMESTAMP(0) DEFAULT NULL
`update_time` TIMESTAMP(0) DEFAULT NULL
如果把DEFAULT NULL去掉后,執行可以通過
使用show create table 表名
查看建表語句,其他建表語句省略
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `update_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
在STRICT_TRANS_TABLE模式下,
缺省時,第一個timestamp字段會為它設置當前系統時間戳,並且會隨着記錄的更新自動更新。
第二個及后面的timestamp列都默認設置為 年 - 月 - 日 時:分:秒
一般來說,create_time,這個創建時間第一次賦值后就不變了,而系統默認是自動更新的,不符合我們的需求。
我們需要在建表的時候主動設置默認值
`create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `update_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
等價的
`create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `update_time` timestamp,
只有第一個timestamp才會設置,第二個及后面的都是默認設置為0000-00-00 00:00:00
額外的內容:
sql_mode可以在my.ini或者my.inf文件的[mysqld]節點下進行配置
sql_mode的值
ONLY_FULL_GROUP_BY
出現在select語句、HAVING條件和ORDER BY語句中的列,必須是GROUP BY的列或者依賴於GROUP BY列的函數列。
user表有三個字段,name, age, sex
select * from user group by sex; 執行上面的sql語句會報錯ERROR 1055 (42000): select中查詢的是所有列,在group by中必須全部出現才可以 select sex from user group by sex; 這句sql就可以執行通過 如果要讓第一個代碼能正常通過,則需要將sql_mode = ONLY_FULL_GROUP_BY ....這個配置中的ONLY_FULL_GROUP_BY去掉, select * from user group by sex;就可以正常運行
NO_ZERO_IN_DATE:日期類型字段,年月日不能全部為0 在嚴格模式,不接受月或日部分為0的日期。如果使用IGNORE選項,我們為類似的日期插入'0000-00-00'。在非嚴格模式,可以接受該日期,但會生成警告 NO_ZERO_IN_DATE: 在嚴格模式,不接受月或日部分為0的日期。如果使用IGNORE選項,我們為類似的日期插入'0000-00-00'。在非嚴格模式,可以接受該日期,但會生成警告。 NO_ZERO_DATE: 在嚴格模式,不要將 '0000-00-00'做為合法日期。你仍然可以用IGNORE選項插入零日期。在非嚴格模式,可以接受該日期,但會生成警告 ERROR_FOR_DIVISION_BY_ZERO: 在嚴格模式,在INSERT或UPDATE過程中,如果被零除(或MOD(X,0)),則產生錯誤(否則為警告)。如果未給出該模式,被零除時MySQL返回NULL。
如果用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操作結果為NULL NO_AUTO_CREATE_USER: 防止GRANT自動創建新用戶,除非還指定了密碼。 NO_ENGINE_SUBSTITUTION: 如果需要的存儲引擎被禁用或未編譯,那么拋出錯誤。不設置此值時,用默認的存儲引擎替代,並拋出一個異常
