亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

mysql多個TimeStamp設(shè)置的方法解讀

 更新時間:2012年11月12日 09:18:45   作者:  
timestamp設(shè)置默認值是Default CURRENT_TIMESTAMP;timestamp設(shè)置隨著表變化而自動更新是ON UPDATE CURRENT_TIMESTAMP;接下來為您詳細介紹
timestamp設(shè)置默認值是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會默認為表中的第一個timestamp字段(且設(shè)置了NOT NULL)隱式設(shè)置DEFAULAT CURRENT_TIMESTAMP。所以說上例那樣的設(shè)置實際上等同于設(shè)置了兩個CURRENT_TIMESTAMP。

分析需求
一個表中,有兩個字段,createtime和updatetime。
1 當insert的時候,sql兩個字段都不設(shè)置,會設(shè)置為當前的時間
2 當update的時候,sql中兩個字段都不設(shè)置,updatetime會變更為當前的時間

這樣的需求是做不到的。因為你無法避免在兩個字段上設(shè)置CURRENT_TIMESTAMP

解決辦法有幾個:
1 使用觸發(fā)器
當insert和update的時候觸發(fā)器觸發(fā)時間設(shè)置。
網(wǎng)上有人使用這種方法。當然不懷疑這個方法的可用性。但是對于實際的場景來說,無疑是為了解決小問題,增加了復雜性。
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語句減負,感覺上還是值得的。這也確實是修改數(shù)據(jù)庫最小又能保證需求的方法了。當然這個方法也能和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特有的,當數(shù)據(jù)庫從mysql轉(zhuǎn)移到其他數(shù)據(jù)庫的時候,業(yè)務(wù)邏輯代碼是不用修改的。

ps:這三種方法的取舍就完全看你自己的考慮了。順便說一下,最后,我還是選擇第三種方法。

相關(guān)文章

最新評論