2010-01-11 66 views
6

我将DATETIME类型的列tsu(时间戳更新)添加到我的许多表中。MySQL'Update Timestamp'列 - 触发器

我需要编写BEFORE UPDATE触发器,它会将列更新为CURRENT_TIMESTAMP(),但我无法正确理解。试过:

DELIMITER $$ 
CREATE 
    TRIGGER `cams`.`tsu_update_csi` BEFORE UPDATE 
    ON `cams`.`csi` 
    FOR EACH ROW BEGIN 
     UPDATE csi SET tsu = CURRENT_TIMESTAMP WHERE csi_code = OLD.csi_code; 
    END$$ 
DELIMITER ; 

任何人都可以指出我在正确的方向吗? MTIA

+0

你或许应该提到的是你已经有了类TIMESTAMP的列与CURRENT_TIMESTAMP的默认问题,存储记录的创建时间。 – 2010-01-12 18:01:21

+0

你是对的伊恩。我之前并不了解多个TIMESTAMP列的含义。谢谢你的帮助。 – maxhugen 2010-01-12 22:57:17

回答

14

好了,试试这个:

DELIMITER $$ CREATE 
    TRIGGER `cams`.`tsu_update_csi` BEFORE UPDATE 
    ON `cams`.`csi` 
     FOR EACH ROW BEGIN 
     SET NEW.tsu = CURRENT_TIMESTAMP; 
END$$ DELIMITER ; 
+0

谢谢,那个例子就是我需要的!现在了解TIMESTAMP好得多了。 – maxhugen 2010-01-12 22:55:37

7

如果该字段可以被定义为一个时间戳,您可以使用以下命令:

ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP 
       ON UPDATE CURRENT_TIMESTAMP); 
+0

不,我不能这样做,如果我保留原始'ts'列: 'ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP' – maxhugen 2010-01-12 04:11:03

1

不知道它会为你工作,但你总是可以使它是一个没有默认值的TIMESTAMP字段 - MySQL将自动将表中定义的第一个这样的字段的值设置为每次更新时的当前时间戳。

+0

谢谢Zerofiz和Ian。我已经有了一个'ts'列,它被设置为默认CURRENT_TIMESTAMP,因为它意在表示“创建日期”。从我对TIMESTAMP的阅读中,不可能在一个ts列上使用CURRENT_TIMESTAMP作为默认值,而在另一列中更新(这正是我当然想要的)。 我正在检查客户端,看看我们是否可以使用现有的'ts'字段作为“更新日期”,并免除“创建日期”。 – maxhugen 2010-01-12 01:00:48