久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

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

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

      實(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ù)端對(duì)timestamp列中的默認(rèn)值和NULL值的不同處理方法。

      此變量自MySQL 5.6.6 版本引入,分為全局級(jí)別和會(huì)話級(jí)別,可動(dòng)態(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屬性的話,就會(huì)默認(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值,會(huì)自動(dòng)轉(zhuǎn)化為默認(rèn)值;

      explicit_defaults_for_timestamp=ON,則關(guān)閉timestamp default的特性:

      1、如果沒有被顯示指定not null,則默認(rèn)為null;

      2、默認(rèn)值也會(huì)是null而非CURRENT_TIMESTAMP;

      3、如果指定了not null屬性,inset式不指定該字段的值,strict sql_mode下,會(huì)報(bào)錯(cuò)。非strict sql_mode下插入’0000-00-00 00:00:00’;

      需要仔細(xì)考慮下面的場(chǎng)景:

      1、timestamp not null default CURRENT_TIMESTAMP,當(dāng)explicit_defaults_for_timestamp由0轉(zhuǎn)為1時(shí)會(huì)帶來什么業(yè)務(wù)影響?

      這樣的轉(zhuǎn)化,如果該timestamp字段有默認(rèn)值,會(huì)造成原本insert 該timestamp字段value為null的語句會(huì)插入失敗,影響業(yè)務(wù);

      2、datetime default null 轉(zhuǎn)成 timestamp default CURRENT_TIMESTAMP,又會(huì)帶來什么業(yè)務(wù)影響呢?

      做這樣的字段轉(zhuǎn)化,會(huì)把原本該字段為null的值都轉(zhuǎn)化為CURRENT_TIMESTAMP,如果歷史數(shù)據(jù)多的化,這樣的轉(zhuǎn)化是非常耗資源的。同時(shí)還需考慮值的轉(zhuǎn)變對(duì)業(yè)務(wù)帶來的影響。

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

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