本篇文章給大家?guī)砹薽ysql中關(guān)于字段默認(rèn)值可能會出現(xiàn)的相關(guān)問題,希望對大家有幫助。
今天業(yè)務(wù)反饋了一個問題,modify_time字段不允許為null,而業(yè)務(wù)反饋這個字段是設(shè)置了默認(rèn)值的,具體的業(yè)務(wù)報錯信息如下所示:
從報錯信息看,可能是modify_time字段沒有設(shè)置默認(rèn)值或默認(rèn)值設(shè)置的不正確導(dǎo)致
接下來查看一下表結(jié)構(gòu):
CREATE TABLE `jj_xxxx` ( .... `create_time` timestamp NOT NULL DEFAULT '1999-12-31 23:00:00' , `update_user` int DEFAULT NULL, `modify_time` timestamp NOT NULL DEFAULT '1999-12-31 23:00:00', .... PRIMARY KEY (`goods_id`) ) ENGINE=InnoDB AUTO_INCREMENT=4893 DEFAULT CHARSET=utf8 COMMENT='xxxxx'
從表結(jié)構(gòu)看,設(shè)置的默認(rèn)值好像也沒有啥問題,檢查一下sql_mode參數(shù)的設(shè)置,好像也沒有發(fā)現(xiàn)啥問題;
業(yè)務(wù)人員反饋線上的表也是這樣的,但是線上是正常的,而目前要把這個業(yè)務(wù)遷移到其他的環(huán)境,從業(yè)務(wù)到數(shù)據(jù)庫是另外一套環(huán)境;
忽然考慮到了數(shù)據(jù)庫版本的差異;遷移的新環(huán)境是MySQL 8.0版本,而線上環(huán)境是5.7版本,兩個版本中參數(shù)explicit_defaults_for_timestamp 設(shè)置的默認(rèn)值是不一樣的;
原因:
explicit_defaults_for_timestamp 系統(tǒng)變量決定MySQL服務(wù)端對timestamp列中的默認(rèn)值和NULL值的不同處理方法。
此變量自MySQL 5.6.6 版本引入,分為全局級別和會話級別,可動態(tài)更新,默認(rèn)值為OFF。
在8.0之中默認(rèn)值改為了on
explicit_defaults_for_timestamp=OFF,表示使用默認(rèn)的timestamp默認(rèn)格式;timestamp類型的默認(rèn)格式是什么樣的呢?
1、和其它字段類型不一樣,這個字段默認(rèn)為not null.而且不允許設(shè)置default null.
2、第一列timestamp字段,如果不強制指定默認(rèn)值或on update屬性的話,就會默認(rèn)設(shè)為DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP。
3、非第一列timestamp字段,如果不強制指定默認(rèn)值,DEFAULT ‘0000-00-00 00:00:00’
4、往該列中插入null值,會自動轉(zhuǎn)化為默認(rèn)值;
explicit_defaults_for_timestamp=ON,則關(guān)閉timestamp default的特性:
1、如果沒有被顯示指定not null,則默認(rèn)為null;
2、默認(rèn)值也會是null而非CURRENT_TIMESTAMP;
3、如果指定了not null屬性,inset式不指定該字段的值,strict sql_mode下,會報錯。非strict sql_mode下插入’0000-00-00 00:00:00’;
需要仔細(xì)考慮下面的場景:
1、timestamp not null default CURRENT_TIMESTAMP,當(dāng)explicit_defaults_for_timestamp由0轉(zhuǎn)為1時會帶來什么業(yè)務(wù)影響?
這樣的轉(zhuǎn)化,如果該timestamp字段有默認(rèn)值,會造成原本insert 該timestamp字段value為null的語句會插入失敗,影響業(yè)務(wù);
2、datetime default null 轉(zhuǎn)成 timestamp default CURRENT_TIMESTAMP,又會帶來什么業(yè)務(wù)影響呢?
做這樣的字段轉(zhuǎn)化,會把原本該字段為null的值都轉(zhuǎn)化為CURRENT_TIMESTAMP,如果歷史數(shù)據(jù)多的化,這樣的轉(zhuǎn)化是非常耗資源的。同時還需考慮值的轉(zhuǎn)變對業(yè)務(wù)帶來的影響。
推薦學(xué)習(xí):mysql視頻教程