我有以下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_AUPD
AFTER UPDATE ON Booking FOR EACH ROW
我遇到的问题是如何在AFTER UPDATE触发器中获取OLD字段值?
5条答案
按热度按时间xkrw2x1b1#
在
UPDATE TRIGGER
中,您可以使用OLD
关键字访问被更新替换的行数据。NEW
关键字允许访问传入的行数据,如果成功,则将替换旧行。UPDATE
触发器的示例是:此处为SQLFiddle
根据创建的触发器类型,
OLD
和NEW
行可能不可用:NEW
伪行。NEW
和OLD
伪行OLD
伪行即,在
INSERT
触发器上没有OLD
行,并且在DELETE
触发器上没有NEW
行。问题
OP没有提供实际的代码,以及注解中提到的错误消息:
INSERT触发器上没有OLD行
表示OP无意中创建了一个
INSERT TRIGGER
,而不是问题中指出的UPDATE TRIGGER
。INSERT
触发器没有OLD
伪表。lyr7nygr2#
出现错误的最可能的解释是
你正在执行一个创建
AFTER INSERT
触发器的语句,而不是创建一个AFTER UPDATE
触发器。不能引用行中的OLD值(因为该行在INSERT之前就已存在)的原因是,该行在INSERT之前并不存在。
f0ofjuux3#
在触发器主体中,OLD和NEW关键字使您能够访问受触发器影响的行中的列。OLD和NEW是触发器的MySQL扩展;它们不区分大小写。
在INSERT触发器中,只能使用NEW.col_name;没有旧行。在DELETE触发器中,只能使用OLD.col_name;没有新行。在UPDATE触发器中,可以使用OLD.col_name引用行更新前的列,使用NEW.col_name引用行更新后的列。
35g0bw714#
如果我没猜错的话..
答案是否定的!AFTER INSERT触发器中不能有OLD.col_name。
在mysql ref manual中,它明确指出:
在INSERT触发器中,只能使用NEW.col_name;没有旧行。在DELETE触发器中,只能使用OLD.col_name;没有新行。在UPDATE触发器中,可以使用OLD.col_name引用行更新前的列,使用NEW.col_name引用行更新后的列。
Trigger Syntax
uqcuzwp85#
下面是我关于当某些列值更新时触发器如何工作的完整代码