mysql - 在更新语句后获取 MySQL 触发器中的旧值

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

这称为创建触发器 Booking_AUPD AFTER UPDATE ON Booking FOR EACH ROW

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

最佳答案

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 的问题

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

There is no OLD row in on INSERT trigger

表示 OP 无意中创建了一个 INSERT TRIGGER 而不是问题中指出的 UPDATE TRIGGERINSERT 触发器没有 OLD 伪表。

关于mysql - 在更新语句后获取 MySQL 触发器中的旧值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17681308/

相关文章:

php - 如何在不使用目录的情况下显示数据库中的图像

mysql - 我的.cnf : Improve speed of adding new columns and indexes in large MySQL tables

sql - 使用 Merge 语句到触发器中

mysql - 使用 MySQL 记录所有表上的所有事件

postgresql - 错误 : unterminated quoted string at or near

SQLite - 在表 1 上插入触发器以有条件更新表 2

javascript - Jquery OnLoad - 奇怪的行为

python - 如何在 kubernetes 集群内使用脚本语言连接数据库

php - 省略/忽略用户已购买的任何记录

php - 将数据导出为 .sql 格式。如何逃脱?