Mysql" BEFORE UPDATE"触发具有两个时间戳列的表的奇怪行为

时间:2015-03-12 11:12:56

标签: mysql triggers timestamp updates

我正在使用mysql - (mysql Ver 14.12 Distrib 5.0.67,for suse-linux-gnu(x86_64))

我有一张桌子" MyTable",它有三列 - 一列" Col1"类型" varchar"和两列" UpdateTime"和" InsertTime"类型"时间戳"

我想使用InsertTime跟踪记录插入的时间,使用UpdateTime跟踪记录更新的时间。

的MySQL>描述MyTable;

| Field                 | Type         | Null | Key | Default             | 

+-----------------------+--------------+------+-----+---------------------+

|Col1                   | varchar(64)  | YES  |     | NULL                |

|InsertTime             | timestamp    | NO   |     | CURRENT_TIMESTAMP 


|UpdateTime             | timestamp    | NO   |     | 0000-00-00 00:00:00 

我有一个如下的触发器定义,可以确保在更新MyTable时,InsertTime时间戳将保留为原始创建时间戳,但UpdateTime时间戳将更新为当前时间戳

 DELIMITER $$
 DROP TRIGGER IF EXISTS `MyTable_UPDATE`;  $$
 CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON MyTable
 FOR EACH ROW
 BEGIN
    SET NEW.`UpdateTime` = CURRENT_TIMESTAMP ;
    SET NEW.`InsertTime` = OLD.`InsertTime`;
 END $$
 DELIMITER ;  

问题是当我更新" MyTable"如下

update MyTable set Col1=NULL ;

然后,InsertTime值也与UpdateTime一起设置为CURRENT_TIMESTAMP。 如果我将触发器定义更改为如下(通过删除对UpdateTime的赋值 - 这不是我想要的),这个问题就消失了(它保留了InsertTime)。

DELIMITER $$
 DROP TRIGGER IF EXISTS `MyTable_UPDATE`;  $$
 CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON MyTable
 FOR EACH ROW
 BEGIN
    # SET NEW.`UpdateTime` = CURRENT_TIMESTAMP ;
    # -- THIS DOES NOT HELP ME I WANT UpdateTime to be updated 
    SET NEW.`InsertTime` = OLD.`InsertTime`;
 END $$
 DELIMITER ;

这是一个BUG还是这种预期的行为。 我怎样才能让它发挥作用?

我尝试按如下方式执行alter table

ALTER TABLE `MyTable`
CHANGE COLUMN `UpdateTime` `UpdateTime` TIMESTAMP NOT NULL DEFAULT   CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ;

但是这给我一个错误如下

"表定义不正确;在DEFAULT或ON UPDATE子句中只能有一个TIMESTAMP列和CURRENT_TIMESTAMP"

任何解决方案?

谢谢

Yogesh

0 个答案:

没有答案