mysql關於timestamp欄位相關內容
阿新 • • 發佈:2019-01-02
發現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: 如果需要的儲存引擎被禁用或未編譯,那麼丟擲錯誤。不設定此值時,用預設的儲存引擎替代,並丟擲一個異常