仅更新一列时 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 ;
我正在尝试创建一个 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 ;