我有以下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触发器中获取OLD字段值?
答案 0 :(得分:15)
获得错误的最可能解释
"There is no OLD row in on INSERT trigger"
是您正在执行创建AFTER INSERT
触发器的语句,而不是创建AFTER UPDATE
触发器。
由于INSERT之前存在的行,因此无法从行引用OLD值的原因是该行在INSERT之前不存在。
答案 1 :(得分:12)
在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;
根据所创建的触发器类型,您可能无法使用OLD
和NEW
行:
INSERT TRIGGER
NEW
伪行。UPDATE TRIGGER
NEW
和OLD
伪行DELETE TRIGGER
OLD
伪行即。 OLD
触发器上没有INSERT
行,NEW
触发器上没有DELETE
行。
OP的问题
OP未提供实际代码,以及评论中提到的错误消息:
INSERT触发器
中没有OLD行
表示OP无意中创建了问题中指出的INSERT TRIGGER
而不是UPDATE TRIGGER
。 INSERT
触发器没有OLD
伪表。
答案 2 :(得分:7)
在触发器主体中,OLD和NEW关键字使您可以访问受触发器影响的行中的列。 OLD和NEW是触发器的MySQL扩展;它们不区分大小写。
在INSERT触发器中,只能使用NEW.col_name;没有旧排。在DELETE触发器中,只能使用OLD.col_name;没有新的行。在UPDATE触发器中,您可以使用OLD.col_name在更新行之前引用行的列,使用NEW.col_name在更新行之后引用该行的列。
答案 3 :(得分:1)
如果我的问题是对的..
答案是否定的!您不能在AFTER UPDATE触发器中使用OLD.col_name。
对于你在mysql参考手册中的参考,它明确规定:
在INSERT触发器中,只能使用NEW.col_name;没有旧排。在DELETE触发器中,只能使用OLD.col_name;没有新的行。在UPDATE触发器中,您可以使用OLD.col_name在更新行之前引用行的列,使用NEW.col_name在更新行之后引用该行的列。
答案 4 :(得分: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 ;