本篇文章給大家帶來了mysql中關于字段默認值可能會出現的相關問題,希望對大家有幫助。

今天業務反饋了一個問題,modify_time字段不允許為null,而業務反饋這個字段是設置了默認值的,具體的業務報錯信息如下所示:

從報錯信息看,可能是modify_time字段沒有設置默認值或默認值設置的不正確導致
接下來查看一下表結構:
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'
從表結構看,設置的默認值好像也沒有啥問題,檢查一下sql_mode參數的設置,好像也沒有發現啥問題;
業務人員反饋線上的表也是這樣的,但是線上是正常的,而目前要把這個業務遷移到其他的環境,從業務到數據庫是另外一套環境;
忽然考慮到了數據庫版本的差異;遷移的新環境是MySQL 8.0版本,而線上環境是5.7版本,兩個版本中參數explicit_defaults_for_timestamp 設置的默認值是不一樣的;
原因:
explicit_defaults_for_timestamp 系統變量決定MySQL服務端對timestamp列中的默認值和NULL值的不同處理方法。
此變量自MySQL 5.6.6 版本引入,分為全局級別和會話級別,可動態更新,默認值為OFF。
在8.0之中默認值改為了on
explicit_defaults_for_timestamp=OFF,表示使用默認的timestamp默認格式;timestamp類型的默認格式是什么樣的呢?
1、和其它字段類型不一樣,這個字段默認為not null.而且不允許設置default null.
2、第一列timestamp字段,如果不強制指定默認值或on update屬性的話,就會默認設為DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP。
3、非第一列timestamp字段,如果不強制指定默認值,DEFAULT ‘0000-00-00 00:00:00’
4、往該列中插入null值,會自動轉化為默認值;
explicit_defaults_for_timestamp=ON,則關閉timestamp default的特性:
1、如果沒有被顯示指定not null,則默認為null;
2、默認值也會是null而非CURRENT_TIMESTAMP;
3、如果指定了not null屬性,inset式不指定該字段的值,strict sql_mode下,會報錯。非strict sql_mode下插入’0000-00-00 00:00:00’;
需要仔細考慮下面的場景:
1、timestamp not null default CURRENT_TIMESTAMP,當explicit_defaults_for_timestamp由0轉為1時會帶來什么業務影響?
這樣的轉化,如果該timestamp字段有默認值,會造成原本insert 該timestamp字段value為null的語句會插入失敗,影響業務;
2、datetime default null 轉成 timestamp default CURRENT_TIMESTAMP,又會帶來什么業務影響呢?
做這樣的字段轉化,會把原本該字段為null的值都轉化為CURRENT_TIMESTAMP,如果歷史數據多的化,這樣的轉化是非常耗資源的。同時還需考慮值的轉變對業務帶來的影響。
推薦學習:mysql視頻教程
站長資訊網