我有以下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在这里
根据创建的触发器类型,您可能无法使用OLD和NEW行:
INSERT TRIGGER
NEW仅访问伪行.更新触发器
NEW和OLD伪行删除TRIGGER
OLD伪行即不存在OLD上排INSERT触发,并没有NEW在列DELETE触发.
OP的问题
OP没有提供实际代码,以及评论中提到的错误消息:
INSERT触发器中没有OLD行
表明OP无意中创建了一个INSERT TRIGGER而不是UPDATE TRIGGER问题中指出的那个.一个INSERT触发器有没有OLD假表.
在触发器主体中,OLD和NEW关键字使您可以访问受触发器影响的行中的列.OLD和NEW是触发器的MySQL扩展; 它们不区分大小写.
在INSERT触发器中,只能使用NEW.col_name; 没有旧排.在DELETE触发器中,只能使用OLD.col_name; 没有新的行.在UPDATE触发器中,您可以使用OLD.col_name在更新行之前引用行的列,使用NEW.col_name在更新行之后引用该行的列.