在书中,#MySQL;管理员的圣经",作者讨论了关于事件,时间和关键词NEW和OLD在触发器中的组合的一些限制。他们说的是以下内容:
-AFTER INSERT:AFTER不支持NEW。将OLD与AFTER INSERT一起使用是没有意义的。
-BEFORE UPDATE:BEFORE UPDATE支持NEW。 BEFORE不支持OLD。
-AFTER UPDATE:AFTER不支持NEW。更新后支持OLD。
-BEFORE DELETE:在BEFORE DELETE中使用NEW是没有意义的。 BEFORE不支持OLD。
-AFTER DELETE:AFTER不支持NEW。 AFTER DELETE支持OLD。
也就是说,根据这本书,例如,当我使用AFTER时,我不能使用NEW。但是,在下面的触发器中,这正是我正在做的事情。如果插入了一些新员工,我会将此员工存储在名为employee_history的备份表中。
CREATE TRIGGER insert_emplyee_history
AFTER INSERT ON EMPLOYEE
FOR EACH ROW
INSERT INTO EMPLOYEE_HISTORY VALUES (NEW.NOME,NEW.SSN,NEW.SALARIO,NEW.DNO);
此触发器在MySQL 5.7中按预期工作。
这本书错了吗? 也许这些约束在最后的版本中已经发生了变化(5.7)。我想知道有关事件,时间和OLD和NEW组合的限制。
答案 0 :(得分:2)
文档中提到的几个项目:
19.3.1 Trigger Syntax and Examples
在INSERT触发器中,只能使用NEW.col_name;没有旧的 行。
(这样的SET语句在AFTER触发器中没有效果,因为 行更改已经发生。)
在NEW
中使用AFTER
完全有效,但无效SET NEW... := ...;
DELIMITER //
CREATE TRIGGER `insert_emplyee_history` AFTER INSERT ON `EMPLOYEE`
FOR EACH ROW
BEGIN
INSERT INTO `EMPLOYEE_HISTORY`
VALUES
(NEW.`NOME`, NEW.`SSN`, NEW.`SALARIO`, NEW.`DNO`);
-- SET NEW.`NOME` := 'NOME' -- NOT VALID IN AFTER
END//
DELIMITER ;