【问题标题】:Constraints regarding NEW and OLD in MySQL triggersMySQL 触发器中关于 NEW 和 OLD 的约束
【发布时间】:2016-03-21 08:21:27
【问题描述】:

在“MySQL 管理员的圣经”一书中,作者讨论了有关触发器中事件、时间和关键字 NEW 和 OLD 组合的一些限制。他们说的是:

-BEFORE INSERT:BEFORE INSERT 支持 NEW。 BEFORE 不支持 OLD。

-AFTER INSERT:AFTER 不支持 NEW。将 OLD 与 AFTER INSERT 一起使用是没有意义的。

-更新前:更新前支持新。 BEFORE 不支持 OLD。

-AFTER UPDATE:AFTER 不支持 NEW。 AFTER UPDATE 支持 OLD。

-BEFORE DELETE:将 NEW 与 BEFORE DELETE 一起使用是没有意义的。 BEFORE 不支持 OLD。

-AFTER DELETE:AFTER 不支持 NEW。 OLD 支持 AFTER DELETE。

也就是说,根据本书,例如,当我使用 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 组合的限制是什么。

【问题讨论】:

  • 考虑到很多使用的装配器是没有意义的。我认为插入后部分是一个错字,因为他们谈论它如何不支持旧的。只有拥有新值才有意义,因为您输入的值是新值,并且不会有旧值,因为记录是新的。更新触发器应该同时具有旧的和新的,因为有时您想要记录两组值以用于审计目的。删除只能有旧值,因为它是被删除的现有记录,所以除了空值/之外没有新信息
  • 谢谢你们的cmets。

标签: mysql database stored-procedures triggers


【解决方案1】:

文档中提到的几个项目:

19.3.1 Trigger Syntax and Examples

  • 在 INSERT 触发器中,只能使用 NEW.col_name;没有旧的 行。

  • (这样的 SET 语句在 AFTER 触发器中无效,因为 行更改将已经发生。)

AFTER中使用NEW完全有效,但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

【讨论】:

  • 是的...确实。你说的对。谢谢你的澄清。
猜你喜欢
  • 1970-01-01
  • 2014-02-15
  • 2021-04-27
  • 2011-06-01
  • 2018-12-19
  • 2018-11-30
  • 2011-08-22
  • 2020-11-10
  • 1970-01-01
相关资源
最近更新 更多