在MySQL触发器AFTER更新语句中获取OLD值

nei*_*ldt 9 mysql triggers

我有以下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;
Run Code Online (Sandbox Code Playgroud)

这被称为每次Booking_AUPD预订更新后的创建触发器

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

spe*_*593 18

获得错误的最可能的解释

"There is no OLD row in on INSERT trigger"
Run Code Online (Sandbox Code Playgroud)

就是你正在执行一个创建AFTER INSERT触发器的语句,而不是创建一个AFTER UPDATE触发器.

无法引用行中OLD值的原因(因为INSERT之前存在的行)是INSERT之前该行不存在的原因.


Stu*_*tLC 15

在an中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;
Run Code Online (Sandbox Code Playgroud)

SQLFiddle在这里

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

INSERT TRIGGER

  • NEW仅访问伪行.

更新触发器

  • 访问NEWOLD伪行

删除TRIGGER

  • 仅访问OLD伪行

即不存在OLD上排INSERT触发,并没有NEW在列DELETE触发.

OP的问题

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

INSERT触发器中没有OLD行

表明OP无意中创建了一个INSERT TRIGGER而不是UPDATE TRIGGER问题中指出的那个.一个INSERT触发器有没有OLD假表.


Gau*_*mar 7

在触发器主体中,OLD和NEW关键字使您可以访问受触发器影响的行中的列.OLD和NEW是触发器的MySQL扩展; 它们不区分大小写.

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