我有一个更新触发器。
从 UPDATE SQL 命令未更新的表中引用属性的正确过程是什么?该属性是否仍在 UPDATE 变量中?我想获取更新行的该属性的值。
最佳答案
您可以使用关键字OLD
来访问MySQL中更新前和更新后的列的值和NEW
.
例如,如果您想确定列的值在更新期间是否实际上已更改,您可以这样做
IF NOT OLD.column_name <=> NEW.column_name THEN
-- do something here
END IF;
注意: <=>
MySQL 中的 NULL 安全比较运算符
顺便说一句:没有 UPDATED
MySQL 中的虚拟表。它来自 SQL Server。
这是一个 SQLFiddle演示。 请注意,即使更新影响了表中的所有记录,log
中仅记录了一条消息 table 。这是因为 id 为 2 的行的值最终保持不变。
更新:保留您的 finished
同步标记您需要所有事件(插入、更新、删除)的触发器。
DELIMITER //
CREATE TRIGGER tg_ai_event
AFTER INSERT ON event
FOR EACH ROW
BEGIN
UPDATE activity a
SET status = (EXISTS(SELECT *
FROM event
WHERE activity = a.activity_id
AND done = 0))
WHERE activity_id = NEW.activity;
END//
CREATE TRIGGER tg_ad_event
AFTER DELETE ON event
FOR EACH ROW
BEGIN
UPDATE activity a
SET status = (EXISTS(SELECT *
FROM event
WHERE activity = a.activity_id
AND done = 0))
WHERE activity_id = OLD.activity;
END//
CREATE TRIGGER tg_au_event
AFTER UPDATE ON event
FOR EACH ROW
BEGIN
IF NOT OLD.activity <=> NEW.activity THEN
-- if activity id was changed for an event then clculate finished flag
-- for both old and new activity id
UPDATE activity a
SET status = (EXISTS(SELECT *
FROM event
WHERE activity = a.activity_id
AND done = 0))
WHERE activity_id IN(OLD.activity, NEW.activity);
ELSE
-- otherwise calculate finished flag only if done flag is changed
IF NOT OLD.done <=> NEW.done THEN
UPDATE activity a
SET status = (EXISTS(SELECT *
FROM event
WHERE activity = a.activity_id
AND done = 0))
WHERE activity_id = NEW.activity;
END IF;
END IF;
END//
DELIMITER ;
这里是SQLFiddle 演示
关于mysql - 触发: Referencing updated attribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21270318/