mysql多個TimeStamp設(shè)置的方法解讀
更新時間:2012年11月12日 09:18:45 作者:
timestamp設(shè)置默認(rèn)值是Default CURRENT_TIMESTAMP;timestamp設(shè)置隨著表變化而自動更新是ON UPDATE CURRENT_TIMESTAMP;接下來為您詳細(xì)介紹
timestamp設(shè)置默認(rèn)值是Default CURRENT_TIMESTAMP
timestamp設(shè)置隨著表變化而自動更新是ON UPDATE CURRENT_TIMESTAMP
但是由于
一個表中至多只能有一個字段設(shè)置CURRENT_TIMESTAMP
兩行設(shè)置DEFAULT CURRENT_TIMESTAMP是不行的。
還有一點要注意
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)建時間',
`updatetime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后更新時間',
PRIMARY KEY (`id`),
UNIQUE INDEX `toid` (`toid`)
)
COMMENT='設(shè)備表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
像這個設(shè)置也是不行的。
原因是mysql會默認(rèn)為表中的第一個timestamp字段(且設(shè)置了NOT NULL)隱式設(shè)置DEFAULAT CURRENT_TIMESTAMP。所以說上例那樣的設(shè)置實際上等同于設(shè)置了兩個CURRENT_TIMESTAMP。
分析需求
一個表中,有兩個字段,createtime和updatetime。
1 當(dāng)insert的時候,sql兩個字段都不設(shè)置,會設(shè)置為當(dāng)前的時間
2 當(dāng)update的時候,sql中兩個字段都不設(shè)置,updatetime會變更為當(dāng)前的時間
這樣的需求是做不到的。因為你無法避免在兩個字段上設(shè)置CURRENT_TIMESTAMP
解決辦法有幾個:
1 使用觸發(fā)器
當(dāng)insert和update的時候觸發(fā)器觸發(fā)時間設(shè)置。
網(wǎng)上有人使用這種方法。當(dāng)然不懷疑這個方法的可用性。但是對于實際的場景來說,無疑是為了解決小問題,增加了復(fù)雜性。
2 將第一個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)建時間',
`updatetime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新時間',
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ù)據(jù)庫最小又能保證需求的方法了。當(dāng)然這個方法也能和1方法同時使用,就能起到減少觸發(fā)器編寫數(shù)量的效果了。
3 老老實實在sql語句中使用時間戳。
這個是最多人也是最常選擇的
表結(jié)構(gòu)上不做過多的設(shè)計:
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)建時間',
`updatetime` TIMESTAMP NOT NULL COMMENT '最后更新時間',
PRIMARY KEY (`id`),
UNIQUE INDEX `toid` (`toid`)
)
COMMENT='設(shè)備表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
這樣你就需要在插入和update的操作的時候?qū)懭刖唧w的時間戳。
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
其實反觀想想,這樣做的好處也有一個:current_timestamp是mysql特有的,當(dāng)數(shù)據(jù)庫從mysql轉(zhuǎn)移到其他數(shù)據(jù)庫的時候,業(yè)務(wù)邏輯代碼是不用修改的。
ps:這三種方法的取舍就完全看你自己的考慮了。順便說一下,最后,我還是選擇第三種方法。
timestamp設(shè)置隨著表變化而自動更新是ON UPDATE CURRENT_TIMESTAMP
但是由于
一個表中至多只能有一個字段設(shè)置CURRENT_TIMESTAMP
兩行設(shè)置DEFAULT CURRENT_TIMESTAMP是不行的。
還有一點要注意
復(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)建時間',
`updatetime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后更新時間',
PRIMARY KEY (`id`),
UNIQUE INDEX `toid` (`toid`)
)
COMMENT='設(shè)備表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
像這個設(shè)置也是不行的。
原因是mysql會默認(rèn)為表中的第一個timestamp字段(且設(shè)置了NOT NULL)隱式設(shè)置DEFAULAT CURRENT_TIMESTAMP。所以說上例那樣的設(shè)置實際上等同于設(shè)置了兩個CURRENT_TIMESTAMP。
分析需求
一個表中,有兩個字段,createtime和updatetime。
1 當(dāng)insert的時候,sql兩個字段都不設(shè)置,會設(shè)置為當(dāng)前的時間
2 當(dāng)update的時候,sql中兩個字段都不設(shè)置,updatetime會變更為當(dāng)前的時間
這樣的需求是做不到的。因為你無法避免在兩個字段上設(shè)置CURRENT_TIMESTAMP
解決辦法有幾個:
1 使用觸發(fā)器
當(dāng)insert和update的時候觸發(fā)器觸發(fā)時間設(shè)置。
網(wǎng)上有人使用這種方法。當(dāng)然不懷疑這個方法的可用性。但是對于實際的場景來說,無疑是為了解決小問題,增加了復(fù)雜性。
2 將第一個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)建時間',
`updatetime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新時間',
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ù)據(jù)庫最小又能保證需求的方法了。當(dāng)然這個方法也能和1方法同時使用,就能起到減少觸發(fā)器編寫數(shù)量的效果了。
3 老老實實在sql語句中使用時間戳。
這個是最多人也是最常選擇的
表結(jié)構(gòu)上不做過多的設(shè)計:
復(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)建時間',
`updatetime` TIMESTAMP NOT NULL COMMENT '最后更新時間',
PRIMARY KEY (`id`),
UNIQUE INDEX `toid` (`toid`)
)
COMMENT='設(shè)備表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
這樣你就需要在插入和update的操作的時候?qū)懭刖唧w的時間戳。
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
其實反觀想想,這樣做的好處也有一個:current_timestamp是mysql特有的,當(dāng)數(shù)據(jù)庫從mysql轉(zhuǎn)移到其他數(shù)據(jù)庫的時候,業(yè)務(wù)邏輯代碼是不用修改的。
ps:這三種方法的取舍就完全看你自己的考慮了。順便說一下,最后,我還是選擇第三種方法。
相關(guān)文章
MySQL錯誤ERROR 2002 (HY000): Can''t connect to local MySQL ser
這篇文章主要介紹了MySQL錯誤ERROR 2002 (HY000): Can't connect to local MySQL server through socket,需要的朋友可以參考下2014-10-10
MySQL字段類型與Java實體類類型對應(yīng)轉(zhuǎn)換關(guān)系詳解
這篇文章主要介紹了MySQL字段類型與Java實體類類型對應(yīng)轉(zhuǎn)換關(guān)系,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
MySQL數(shù)據(jù)庫中的UPDATE(更新數(shù)據(jù))詳解
這篇文章主要詳細(xì)介紹了MySQL的UPDATE語句,包括其基本語法、高級用法、性能優(yōu)化策略以及注意事項,通過示例和實戰(zhàn),幫助讀者更好地理解和應(yīng)用這一重要的SQL命令,需要的朋友可以參考下2024-12-12
mysql數(shù)據(jù)庫表增添字段,刪除字段,修改字段的排列等操作
這篇文章主要介紹了mysql數(shù)據(jù)庫表增添字段,刪除字段,修改字段的排列等操作,修改表指的是修改數(shù)據(jù)庫之后中已經(jīng)存在的數(shù)據(jù)表的結(jié)構(gòu)2022-07-07

