MySQL触发器中有关NEW和OLD的约束

时间:2015-12-15 13:52:37

标签: mysql database stored-procedures triggers

在书中,#MySQL;管理员的圣经",作者讨论了关于事件,时间和关键词NEW和OLD在触发器中的组合的一些限制。他们说的是以下内容:

-BEFORE INSERT:BEFORE INSERT支持NEW。 BEFORE不支持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组合的限制。

1 个答案:

答案 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 ;

SQL Fiddle demo