mysql多個(gè)TimeStamp設(shè)置的方法解讀
更新時(shí)間:2012年11月12日 09:18:45 作者:
timestamp設(shè)置默認(rèn)值是Default CURRENT_TIMESTAMP;timestamp設(shè)置隨著表變化而自動(dòng)更新是ON UPDATE CURRENT_TIMESTAMP;接下來為您詳細(xì)介紹
timestamp設(shè)置默認(rèn)值是Default CURRENT_TIMESTAMP
timestamp設(shè)置隨著表變化而自動(dòng)更新是ON UPDATE CURRENT_TIMESTAMP
但是由于
一個(gè)表中至多只能有一個(gè)字段設(shè)置CURRENT_TIMESTAMP
兩行設(shè)置DEFAULT CURRENT_TIMESTAMP是不行的。
還有一點(diǎn)要注意
CREATE TABLE `device` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`toid` INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'toid',
`createtime` TIMESTAMP NOT NULL COMMENT '創(chuàng)建時(shí)間',
`updatetime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后更新時(shí)間',
PRIMARY KEY (`id`),
UNIQUE INDEX `toid` (`toid`)
)
COMMENT='設(shè)備表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
像這個(gè)設(shè)置也是不行的。
原因是mysql會(huì)默認(rèn)為表中的第一個(gè)timestamp字段(且設(shè)置了NOT NULL)隱式設(shè)置DEFAULAT CURRENT_TIMESTAMP。所以說上例那樣的設(shè)置實(shí)際上等同于設(shè)置了兩個(gè)CURRENT_TIMESTAMP。
分析需求
一個(gè)表中,有兩個(gè)字段,createtime和updatetime。
1 當(dāng)insert的時(shí)候,sql兩個(gè)字段都不設(shè)置,會(huì)設(shè)置為當(dāng)前的時(shí)間
2 當(dāng)update的時(shí)候,sql中兩個(gè)字段都不設(shè)置,updatetime會(huì)變更為當(dāng)前的時(shí)間
這樣的需求是做不到的。因?yàn)槟銦o法避免在兩個(gè)字段上設(shè)置CURRENT_TIMESTAMP
解決辦法有幾個(gè):
1 使用觸發(fā)器
當(dāng)insert和update的時(shí)候觸發(fā)器觸發(fā)時(shí)間設(shè)置。
網(wǎng)上有人使用這種方法。當(dāng)然不懷疑這個(gè)方法的可用性。但是對于實(shí)際的場景來說,無疑是為了解決小問題,增加了復(fù)雜性。
2 將第一個(gè)timestamp的default設(shè)置為0
表結(jié)構(gòu)如下:
CREATE TABLE `device` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`toid` INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'toid',
`createtime` TIMESTAMP NOT NULL DEFAULT 0 COMMENT '創(chuàng)建時(shí)間',
`updatetime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新時(shí)間',
PRIMARY KEY (`id`),
UNIQUE INDEX `toid` (`toid`)
)
COMMENT='設(shè)備表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
這樣的話,你需要的插入和更新操作變?yōu)椋?
insert into device set toid=11,createtime=null;
update device set toid=22 where id=1;
這里注意的是插入操作的createtime必須設(shè)置為null!!
雖然我也覺得這種方法很不爽,但是這樣只需要稍微修改insert操作就能為sql語句減負(fù),感覺上還是值得的。這也確實(shí)是修改數(shù)據(jù)庫最小又能保證需求的方法了。當(dāng)然這個(gè)方法也能和1方法同時(shí)使用,就能起到減少觸發(fā)器編寫數(shù)量的效果了。
3 老老實(shí)實(shí)在sql語句中使用時(shí)間戳。
這個(gè)是最多人也是最常選擇的
表結(jié)構(gòu)上不做過多的設(shè)計(jì):
CREATE TABLE `device` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`toid` INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'toid',
`createtime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',
`updatetime` TIMESTAMP NOT NULL COMMENT '最后更新時(shí)間',
PRIMARY KEY (`id`),
UNIQUE INDEX `toid` (`toid`)
)
COMMENT='設(shè)備表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
這樣你就需要在插入和update的操作的時(shí)候?qū)懭刖唧w的時(shí)間戳。
insert device set toid=11,createtime='2012-11-2 10:10:10',updatetime='2012-11-2 10:10:10'
update device set toid=22,updatetime='2012-11-2 10:10:10' where id=1
其實(shí)反觀想想,這樣做的好處也有一個(gè):current_timestamp是mysql特有的,當(dāng)數(shù)據(jù)庫從mysql轉(zhuǎn)移到其他數(shù)據(jù)庫的時(shí)候,業(yè)務(wù)邏輯代碼是不用修改的。
ps:這三種方法的取舍就完全看你自己的考慮了。順便說一下,最后,我還是選擇第三種方法。
timestamp設(shè)置隨著表變化而自動(dòng)更新是ON UPDATE CURRENT_TIMESTAMP
但是由于
一個(gè)表中至多只能有一個(gè)字段設(shè)置CURRENT_TIMESTAMP
兩行設(shè)置DEFAULT CURRENT_TIMESTAMP是不行的。
還有一點(diǎn)要注意
復(fù)制代碼 代碼如下:
CREATE TABLE `device` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`toid` INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'toid',
`createtime` TIMESTAMP NOT NULL COMMENT '創(chuàng)建時(shí)間',
`updatetime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后更新時(shí)間',
PRIMARY KEY (`id`),
UNIQUE INDEX `toid` (`toid`)
)
COMMENT='設(shè)備表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
像這個(gè)設(shè)置也是不行的。
原因是mysql會(huì)默認(rèn)為表中的第一個(gè)timestamp字段(且設(shè)置了NOT NULL)隱式設(shè)置DEFAULAT CURRENT_TIMESTAMP。所以說上例那樣的設(shè)置實(shí)際上等同于設(shè)置了兩個(gè)CURRENT_TIMESTAMP。
分析需求
一個(gè)表中,有兩個(gè)字段,createtime和updatetime。
1 當(dāng)insert的時(shí)候,sql兩個(gè)字段都不設(shè)置,會(huì)設(shè)置為當(dāng)前的時(shí)間
2 當(dāng)update的時(shí)候,sql中兩個(gè)字段都不設(shè)置,updatetime會(huì)變更為當(dāng)前的時(shí)間
這樣的需求是做不到的。因?yàn)槟銦o法避免在兩個(gè)字段上設(shè)置CURRENT_TIMESTAMP
解決辦法有幾個(gè):
1 使用觸發(fā)器
當(dāng)insert和update的時(shí)候觸發(fā)器觸發(fā)時(shí)間設(shè)置。
網(wǎng)上有人使用這種方法。當(dāng)然不懷疑這個(gè)方法的可用性。但是對于實(shí)際的場景來說,無疑是為了解決小問題,增加了復(fù)雜性。
2 將第一個(gè)timestamp的default設(shè)置為0
表結(jié)構(gòu)如下:
復(fù)制代碼 代碼如下:
CREATE TABLE `device` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`toid` INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'toid',
`createtime` TIMESTAMP NOT NULL DEFAULT 0 COMMENT '創(chuàng)建時(shí)間',
`updatetime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新時(shí)間',
PRIMARY KEY (`id`),
UNIQUE INDEX `toid` (`toid`)
)
COMMENT='設(shè)備表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
這樣的話,你需要的插入和更新操作變?yōu)椋?
insert into device set toid=11,createtime=null;
update device set toid=22 where id=1;
這里注意的是插入操作的createtime必須設(shè)置為null!!
雖然我也覺得這種方法很不爽,但是這樣只需要稍微修改insert操作就能為sql語句減負(fù),感覺上還是值得的。這也確實(shí)是修改數(shù)據(jù)庫最小又能保證需求的方法了。當(dāng)然這個(gè)方法也能和1方法同時(shí)使用,就能起到減少觸發(fā)器編寫數(shù)量的效果了。
3 老老實(shí)實(shí)在sql語句中使用時(shí)間戳。
這個(gè)是最多人也是最常選擇的
表結(jié)構(gòu)上不做過多的設(shè)計(jì):
復(fù)制代碼 代碼如下:
CREATE TABLE `device` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`toid` INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'toid',
`createtime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',
`updatetime` TIMESTAMP NOT NULL COMMENT '最后更新時(shí)間',
PRIMARY KEY (`id`),
UNIQUE INDEX `toid` (`toid`)
)
COMMENT='設(shè)備表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
這樣你就需要在插入和update的操作的時(shí)候?qū)懭刖唧w的時(shí)間戳。
insert device set toid=11,createtime='2012-11-2 10:10:10',updatetime='2012-11-2 10:10:10'
update device set toid=22,updatetime='2012-11-2 10:10:10' where id=1
其實(shí)反觀想想,這樣做的好處也有一個(gè):current_timestamp是mysql特有的,當(dāng)數(shù)據(jù)庫從mysql轉(zhuǎn)移到其他數(shù)據(jù)庫的時(shí)候,業(yè)務(wù)邏輯代碼是不用修改的。
ps:這三種方法的取舍就完全看你自己的考慮了。順便說一下,最后,我還是選擇第三種方法。
相關(guān)文章
MySQL中LIKE運(yùn)算符的多種使用方式及示例演示
無論是簡單的模式匹配還是復(fù)雜的模式匹配,LIKE運(yùn)算符都提供了強(qiáng)大的功能來滿足不同的匹配需求,通過本文的介紹,我們詳細(xì)了解了在MySQL數(shù)據(jù)庫中使用LIKE運(yùn)算符進(jìn)行模糊匹配的多種方式,感興趣的朋友跟隨小編一起看看吧2023-07-07MySQL開發(fā)規(guī)范與使用技巧總結(jié)
今天小編就為大家分享一篇關(guān)于MySQL開發(fā)規(guī)范與使用技巧總結(jié),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03MySQL數(shù)據(jù)庫 1067錯(cuò)誤號(hào)的解決方法
這篇文章主要介紹了MySQL數(shù)據(jù)庫 1067錯(cuò)誤號(hào)的解決方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12MySQL查詢語句過程和EXPLAIN語句基本概念及其優(yōu)化
在MySQL中我們經(jīng)常會(huì)使用到一些查詢語句,如果使用合適的索引會(huì)大大簡化和加速查找,下面小編來和大家一起學(xué)習(xí)一下知識(shí)2019-05-05docker 部署mysql詳細(xì)過程(docker部署常見應(yīng)用)
這篇文章主要介紹了docker 部署mysql之docker部署常見應(yīng)用,本文以docker部署mysql5.7.26為例,通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08mysql自動(dòng)定時(shí)備份數(shù)據(jù)庫的最佳方法(windows服務(wù)器)
網(wǎng)上有很多關(guān)于window下Mysql自動(dòng)備份的方法,可是真的能用的也沒有幾個(gè),有些說的還非常的復(fù)雜,難以操作,這里腳本之家小編為大家分享與整理了幾個(gè)軟件方便大家使用2016-11-11