仅更新一列时 MySQL 触发器上的语法错误



我正在尝试创建一个MySQL触发器,该触发器在表wp_users中更新列user_email时触发,但它失败了。我在第二个 BEGIN 之前收到语法错误,但对我来说看起来不错。我错过了什么?

CREATE TRIGGER `email_update` 
AFTER UPDATE ON `wp_users` 
FOR EACH ROW 
BEGIN IF NEW.user_email <> OLD.user_email
    BEGIN 
        INSERT INTO `bfintranet`.`intranet_staff_updates` (`staff_update_ID`, `user_ID`, `updated_value`, `new_value`, `old_value`, `update_datetime`) 
        VALUES (NULL, NEW.ID, 'user_email', NEW.user_email, OLD.user_email, now()) 
    END 
END;

如果没有仅一列条件,它可以正常工作(但无法实现我想要的):

CREATE TRIGGER `email_update` 
AFTER UPDATE ON `wp_users` 
FOR EACH ROW 
INSERT INTO `bfintranet`.`intranet_staff_updates` (`staff_update_ID`, `user_ID`, `updated_value`, `new_value`, `old_value`, `update_datetime`) VALUES (NULL, NEW.ID, 'user_email', NEW.user_email, OLD.user_email, now())

它似乎在 IF 之后的任何内容上都出错,无论之后是什么或 IF 条件是什么。

你有几个问题。

首先,您应该查看MySQL IF...THEN...END IF语法:https://dev.mysql.com/doc/refman/5.5/en/if.html

此外,对于像这样的复杂查询,您需要暂时覆盖默认分隔符,以便您可以在触发器中使用分号。

这应该有效:

DELIMITER $$
CREATE TRIGGER `email_update` 
AFTER UPDATE ON `wp_users` 
FOR EACH ROW 
BEGIN IF NEW.user_email <> OLD.user_email
    THEN 
        INSERT INTO `bfintranet`.`intranet_staff_updates` (`staff_update_ID`, `user_ID`, `updated_value`, `new_value`, `old_value`, `update_datetime`) 
        VALUES (NULL, NEW.ID, 'user_email', NEW.user_email, OLD.user_email, now());
    END IF;
END $$
DELIMITER ;

以下内容应修复此特定错误:

CREATE TRIGGER `email_update` 
AFTER UPDATE ON `wp_users` 
CREATE TRIGGER `email_update` 
AFTER UPDATE ON `wp_users` 
FOR EACH ROW 
BEGIN 
    IF NEW.user_email <> OLD.user_email
    THEN
        INSERT INTO `bfintranet`.`intranet_staff_updates` (`staff_update_ID`, `user_ID`, `updated_value`, `new_value`, `old_value`, `update_datetime`) 
        VALUES (NULL, NEW.ID, 'user_email', NEW.user_email, OLD.user_email, now()) 
    END IF 
END;

最新更新