1. 程式人生 > >mysql關於timestamp欄位相關內容

mysql關於timestamp欄位相關內容

發現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: 如果需要的儲存引擎被禁用或未編譯,那麼丟擲錯誤。不設定此值時,用預設的儲存引擎替代,並丟擲一個異常