欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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)要注意
復(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)文章

最新評論