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

Syntax error on MySQL trigger when only updating one column

我正在尝试创建一个 MySQL 触发器,当列 user_email 在 table wp_users 中更新时触发,但它失败了。我在第二个 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 条件是什么,它似乎都会出错。

以下应修复此特定错误:

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;

你有几个问题。

首先你应该复习一下 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 ;