仅更新一列

时间:2015-06-19 13:47:28

标签: mysql sql triggers

我正在尝试创建一个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条件是什么。

2 个答案:

答案 0 :(得分:2)

你有几个问题。

首先,您应该查看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 ;

答案 1 :(得分:0)

以下内容应解决此特定错误:

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;