不做死就不會死mysql
在定義建立時間和 更新時間的時候;sql
定義了2個 timestamp 類型,而且給他來個默認值:CURRENT_TIMESTAMP數據庫
而後保存:居然不能夠思議的報錯了。。。這是爲何呢?服務器
糾結了一下 果斷去探討下timestamp 發現:測試
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
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
一個表中,有兩個字段,createtime和updatetime。io
這樣的需求mysql5.6前的版本顯然是作不到的。由於你沒法避免在兩個字段上設置CURRENT_TIMESTAMP
那活仍是得作呀!下面提供幾種方法:
當insert和update的時候觸發器觸發時間設置。 這個方法確定是可行的,這是其中一種解決問題的手段,可是我我的感受視乎代價有點大了。。。
這樣作的好處也有一個:current_timestamp是mysql特有的,當數據庫從mysql轉移到其餘數據庫的時候,業務邏輯代碼是不用修改的。
方法不少。。。可能還有我沒想到的。。。