13

我有以下 MySQL 触发器

SET @iUserId = OLD.LastChangedBy; 

IF NOT NEW.LastChangedBy <=> OLD.LastChangedBy THEN
    SET @iUserId = NEW.LastChangedBy;
END IF;

IF NOT NEW.BookingId<=> OLD.BookingId THEN
    INSERT INTO AuditTrail VALUES (UUID(),@iUserId,'UPDATE','Booking', OLD.BookingId,'BookingType ',OLD.BookingType ,NEW.BookingType ,NOW());
END IF;

这被称为 CREATE TRIGGER Booking_AUPDAFTER UPDATE ON Booking FOR EACH ROW

我遇到的问题是如何在 AFTER UPDATE 触发器中获取 OLD 字段值?

4

5 回答 5

25

在 中UPDATE TRIGGER,您可以使用OLD关键字访问正在被更新替换的行数据。如果成功,该NEW关键字允许访问将替换旧行的传入行数据。

UPDATE触发器的一个例子是:

CREATE TRIGGER upd_check AFTER UPDATE ON SomeTable
    FOR EACH ROW
    BEGIN
       IF (OLD.LastChangedBy <> NEW.LastChangedBy) THEN
         INSERT INTO AuditSomeTable(ID, LastChangedBy) 
         VALUES (OLD.ID, OLD.LastChangedBy);
       END IF;
    END;

SQLFiddle在这里

根据创建的触发器类型,您可能无法使用OLD和行:NEW

插入触发器

  • 仅访问NEW伪行。

更新触发器

  • 访问NEWOLD伪行

删除触发器

  • 仅访问OLD伪行

即触发器上没有行,触发器OLD上没有行。INSERTNEWDELETE

OP的问题

OP没有提供实际代码,评论中提到的错误信息:

INSERT 触发器中没有 OLD 行

表示 OP 无意中创建了 anINSERT TRIGGER而不是UPDATE TRIGGER问题中指出的 an 。INSERT触发器没有OLD伪表。

于 2013-07-16T16:35:04.670 回答
21

出错的最可能解释

"There is no OLD row in on INSERT trigger"

是您正在执行创建AFTER INSERT触发器的语句,而不是创建AFTER UPDATE触发器。

由于该行在 INSERT 之前存在,因此您无法从该行引用 OLD 值的原因是该行在 INSERT 之前不存在。

于 2013-07-16T18:01:12.467 回答
9

在触发器正文中,OLD 和 NEW 关键字使您能够访问受触发器影响的行中的列。OLD 和 NEW 是 MySQL 对触发器的扩展;它们不区分大小写。

在 INSERT 触发器中,只能使用 NEW.col_name;没有旧行。在 DELETE 触发器中,只能使用 OLD.col_name;没有新行。在 UPDATE 触发器中,您可以使用 OLD.col_name 来引用行更新之前的列,使用 NEW.col_name 来引用行更新后的列。

于 2015-09-24T05:59:04.793 回答
3

如果我没听错你的问题..

答案是不!您不能在 AFTER UPDATE 触发器中使用 OLD.col_name。

供您在 mysql ref 手册中参考,它明确规定:

在 INSERT 触发器中,只能使用 NEW.col_name;没有旧行。在 DELETE 触发器中,只能使用 OLD.col_name;没有新行。在 UPDATE 触发器中,您可以使用 OLD.col_name 来引用行更新之前的列,使用 NEW.col_name 来引用行更新后的列。

触发器语法

于 2014-10-16T07:15:57.660 回答
0

这是我更新某些列值时触发器如何工作的完整代码

DELIMITER $$

CREATE TRIGGER `salestatus_after_update` AFTER UPDATE ON `salesdata`
 FOR EACH ROW BEGIN

        IF NEW.sale_status <> OLD.sale_status THEN
            SET @changetype = 'Sale Status Updated';
        ELSE
            SET @changetype = 'Sale Edited';
        END IF;

        INSERT INTO sales_notification (sale_id, changetype, notify_to, old_value, new_value) VALUES (NEW.id, @changetype, NEW.submit_by, OLD.sale_status, NEW.sale_status);

    END$$

DELIMITER ;
于 2019-07-02T13:52:32.890 回答