mysql版本體驗記錄之timestamp

mysql版本體驗記錄之timestamp

1.timestamp 說默認值只有一個

不做死就不會死mysql

在定義建立時間和 更新時間的時候;sql

定義了2個 timestamp 類型,而且給他來個默認值:CURRENT_TIMESTAMP數據庫

而後保存:居然不能夠思議的報錯了。。。這是爲何呢?服務器

糾結了一下 果斷去探討下timestamp 發現:測試

2.問題分析:

2.1 mysql5.5版本下:

1.第一個未設置默認值的TIMESTAMP NOT NULL字段隱式默認值: 

    CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    
2.後面未設置默認值的TIMESTAMP NOT NULL字段隱式默認值: 

    0000-00-00 00:00:00

3.TIMESTAMP NOT NULL字段插入NULL時,會使用隱式默認值:
    
    CURRENT_TIMESTAMP

4.不支持多個CURRENT_TIMESTAMP 默認值

換句話說你的建立語句是:code

CREATE TABLE `test` (
`id`  int(11) NOT NULL ,
`create`  timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP ,
`update`  timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP ,
PRIMARY KEY (`id`)
)
;

可是mysql5.5會幫你轉換成:server

CREATE TABLE `test` (
  `id` int(11) NOT NULL,
  `create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `update` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

插入數據:ci

INSERT INTO `test2` () VALUES ()

得出結果:it

select * from test2;

id  create              update
0    2017-10-10 16:23:05    0000-00-00 00:00:00

2.2 mysql5.6版本下:

1.支持多個CURRENT_TIMESTAMP 默認值;


2.能夠兼容5.5的行爲,支持隱性默認值 

        explicit_defaults_for_timestamp=0
        我測試安裝的MySQL5.6默認使用這個參數,啓動時,服務器會給出一個警告。 
        [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use –explicit_defaults_for_timestamp server option (see documentation for more details).
        
3.能夠去掉隱性默認值 
    explicit_defaults_for_timestamp=1

3.需求分析:

一個表中,有兩個字段,createtime和updatetime。io

  1. 當insert的時候,sql兩個字段都不設置,會設置爲當前的時間
  2. 當update的時候,sql中兩個字段都不設置,updatetime會變動爲當前的時間

這樣的需求mysql5.6前的版本顯然是作不到的。由於你沒法避免在兩個字段上設置CURRENT_TIMESTAMP

那活仍是得作呀!下面提供幾種方法:

3.1 使用觸發器

當insert和update的時候觸發器觸發時間設置。

這個方法確定是可行的,這是其中一種解決問題的手段,可是我我的感受視乎代價有點大了。。。

3.2 在sql語句中使用時間戳。

這樣作的好處也有一個:current_timestamp是mysql特有的,當數據庫從mysql轉移到其餘數據庫的時候,業務邏輯代碼是不用修改的。

方法不少。。。可能還有我沒想到的。。。

相關文章
相關標籤/搜索