MySQL“更新时间戳”列 - 触发器

12

我正在向我的一些表中添加一个类型为DATETIME的名为tsu(时间戳更新)的列。

我需要编写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 ;

请问有人能指导我正确的方向吗? 谢谢!


你应该在问题中提到,你已经有一个类型为TIMESTAMP并带有默认值CURRENT_TIMESTAMP的列,用于存储记录创建时间。 - Ian Clelland
你说得对,Ian。我之前没有理解多个 TIMESTAMP 列的含义。感谢你的帮助。 - maxhugen
5个回答

19

好的,请尝试这个:

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

谢谢,那个例子正是我需要的!现在更好地理解了 TIMESTAMP。 - maxhugen

15
如果字段可以定义为时间戳,你可以使用以下内容:
ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
              ON UPDATE CURRENT_TIMESTAMP);

不行,如果我保留原始的 ts 列,就无法这样做: ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP - maxhugen

1

不知道这对你是否有用,但你可以将其设置为没有默认值的TIMESTAMP字段 - MySQL会自动将表中定义的第一个此类字段的值设置为每次更新时的当前时间戳。


1
感谢Zerofiz和Ian。我已经有一个名为“ts”的列,它的默认值设置为CURRENT_TIMESTAMP,因为它旨在表示“创建日期”。从我对TIMESTAMP的了解来看,不可能在一个ts列上使用CURRENT_TIMESTAMP作为默认值,并在另一个列上进行更新(这当然是我真正想要的)。我正在与客户核实是否可以将现有的“ts”字段用作“更新日期”,并放弃“创建日期”。 - maxhugen

0

网络上有很多不起作用或难以理解的示例。 我花了几个小时来为我的EFFCORE CMS编写一个可行的示例。 这是这个示例:

在UPDATE时触发

DELIMITER ;;
CREATE TRIGGER `updated_at__on_update`
BEFORE UPDATE
ON `demo`
FOR EACH ROW
BEGIN
   SET new.updated_at = UNIX_TIMESTAMP();
END;;
DELIMITER ;

在插入时触发

DELIMITER ;;
CREATE TRIGGER `updated_at__on_insert`
BEFORE INSERT
ON `demo`
FOR EACH ROW
BEGIN
   SET new.updated_at = UNIX_TIMESTAMP();
END;;
DELIMITER ;

表格 demo

CREATE TABLE `demo` (
    `id` int NOT NULL AUTO_INCREMENT,
    `text` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
    `updated_at` int NOT NULL DEFAULT '0',
    PRIMARY KEY (`id`)
);

0

ts2 CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 可用于 DATETIMETIMESTAMP 字段,适用于单个和多个字段

因此,您可以使用 datecreated CURRENT_TIMESTAMP(作为默认值)

而 dateupdated CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 可用于 DATETIMETIMESTAMP 字段(作为默认值)

您可以将上述内容用作 MySQL Workbench 中的 SQL 命令或默认值


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接