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

时间:2013-07-16 15:53:03

标签: 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;

在每次预订的更新后,这被称为CREATE TRIGGER Booking_AUPD

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

5 个答案:

答案 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;

SQLFiddle此处

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

INSERT TRIGGER

  • 仅访问NEW伪行。

UPDATE TRIGGER

  • 访问NEWOLD伪行

DELETE TRIGGER

  • 仅访问OLD伪行

即。 OLD触发器上没有INSERT行,NEW触发器上没有DELETE行。

OP的问题

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

  

INSERT触发器

中没有OLD行

表示OP无意中创建了问题中指出的INSERT TRIGGER而不是UPDATE TRIGGERINSERT触发器没有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在更新行之后引用该行的列。

Trigger Syntax

答案 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 ;