亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長資訊網(wǎng)
    最全最豐富的資訊網(wǎng)站

    實(shí)例分享之MySQL 8.0 timestamp引發(fā)的問題

    本篇文章給大家?guī)砹薽ysql中關(guān)于字段默認(rèn)值可能會出現(xiàn)的相關(guān)問題,希望對大家有幫助。

    實(shí)例分享之MySQL 8.0 timestamp引發(fā)的問題

    今天業(yè)務(wù)反饋了一個(gè)問題,modify_time字段不允許為null,而業(yè)務(wù)反饋這個(gè)字段是設(shè)置了默認(rèn)值的,具體的業(yè)務(wù)報(bào)錯(cuò)信息如下所示:

    實(shí)例分享之MySQL 8.0 timestamp引發(fā)的問題

    從報(bào)錯(cuò)信息看,可能是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ù)人員反饋線上的表也是這樣的,但是線上是正常的,而目前要把這個(gè)業(yè)務(wù)遷移到其他的環(huán)境,從業(yè)務(wù)到數(shù)據(jù)庫是另外一套環(huán)境;

    忽然考慮到了數(shù)據(jù)庫版本的差異;遷移的新環(huán)境是MySQL 8.0版本,而線上環(huán)境是5.7版本,兩個(gè)版本中參數(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、和其它字段類型不一樣,這個(gè)字段默認(rèn)為not null.而且不允許設(shè)置default null.

    2、第一列timestamp字段,如果不強(qiáng)制指定默認(rèn)值或on update屬性的話,就會默認(rèn)設(shè)為DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP。

    3、非第一列timestamp字段,如果不強(qiáng)制指定默認(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下,會報(bào)錯(cuò)。非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時(shí)會帶來什么業(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)化是非常耗資源的。同時(shí)還需考慮值的轉(zhuǎn)變對業(yè)務(wù)帶來的影響。

    推薦學(xué)習(xí):mysql視頻教程

    贊(0)
    分享到: 更多 (0)
    網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號