在MySQL触发器AFTER Update语句中获取旧值

laik7k3q  于 2023-04-19  发布在  Mysql
关注(0)|答案(5)|浏览(347)

我有以下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字段值?

xkrw2x1b

xkrw2x1b1#

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行可能不可用:

  • 插入触发器 *
  • 仅访问NEW伪行。
  • 更新触发器 *
  • 访问NEWOLD伪行
  • 删除触发器 *
  • 仅访问OLD伪行

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

问题

OP没有提供实际的代码,以及注解中提到的错误消息:
INSERT触发器上没有OLD行
表示OP无意中创建了一个INSERT TRIGGER,而不是问题中指出的UPDATE TRIGGERINSERT触发器没有OLD伪表。

lyr7nygr

lyr7nygr2#

出现错误的最可能的解释是

"There is no OLD row in on INSERT trigger"

你正在执行一个创建AFTER INSERT触发器的语句,而不是创建一个AFTER UPDATE触发器。
不能引用行中的OLD值(因为该行在INSERT之前就已存在)的原因是,该行在INSERT之前并不存在。

f0ofjuux

f0ofjuux3#

在触发器主体中,OLD和NEW关键字使您能够访问受触发器影响的行中的列。OLD和NEW是触发器的MySQL扩展;它们不区分大小写。
在INSERT触发器中,只能使用NEW.col_name;没有旧行。在DELETE触发器中,只能使用OLD.col_name;没有新行。在UPDATE触发器中,可以使用OLD.col_name引用行更新前的列,使用NEW.col_name引用行更新后的列。

35g0bw71

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

uqcuzwp8

uqcuzwp85#

下面是我关于当某些列值更新时触发器如何工作的完整代码

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 ;

相关问题