创建上次修改的SQL触发器

时间:2014-10-16 16:20:02

标签: mysql sql database-design syntax

我正在尝试创建一个触发器,以便在更新行时更新last_modified字段。

这就是我的尝试:

USE `mydb`;

DELIMITER $$
DROP TRIGGER IF EXISTS mydb.products_AUPD$$

USE `mydb`$$
CREATE TRIGGER `products_AUPD` AFTER UPDATE ON products 
    FOR EACH ROW BEGIN
        SET NEW.`last_modified` = NOW();
    END;
$$
DELIMITER ;

问题是MySQL工作台不会让我保存它(我假设它有问题,但我无法找到答案)

1 个答案:

答案 0 :(得分:0)

原来我使用的MySQL Workbench版本(6.0xxx)有一个错误,它对触发器造成了严重破坏。我更新到6.2xxx。

这是第一个问题。

第二个问题我在NEW触发器中使用AFTER关键字是不允许的:

  

在触发器主体中,您可以引用主题表中的列   (与触发器关联的表)使用别名OLD和   新。 OLD.col_name引用现有行的列   更新或删除。 NEW.col_name引用新行的列   插入或更新后的现有行。

所以我的新触发器看起来像这样:

CREATE DEFINER = CURRENT_USER TRIGGER `mydb`.`products_BEFORE_UPDATE` BEFORE UPDATE ON `products` FOR EACH ROW
BEGIN
    SET NEW.`last_modified` = NOW();
END;

请注意,没有USEDELIMITER声明?这是因为MySQL Workbench的新版本为您提供了此功能(包括结束分隔符$$):

USE `mydb`;

DELIMITER $$

USE `mydb`$$
DROP TRIGGER IF EXISTS `mydb`.`products_BEFORE_INSERT` $$
USE `mydb`$$
CREATE DEFINER = CURRENT_USER TRIGGER `mydb`.`products_BEFORE_INSERT` BEFORE INSERT ON `products` FOR EACH ROW
BEGIN
    SET NEW.`last_modified` = NOW();
END;$$