我有以下trigger
调用update_recipe_timestamp_proc
function
来更新 modified_on 列。
如果插入/更新了相同的值,虽然没有提供新值,但仍会触发trigger
!
CREATE TRIGGER update_recipes_timestamp_r
BEFORE UPDATE OF "identifier", "name", "description"
ON recipes
FOR EACH ROW EXECUTE PROCEDURE update_recipe_timestamp_proc();
CREATE OR REPLACE FUNCTION update_recipe_timestamp_proc()
RETURNS TRIGGER AS $$
BEGIN
NEW."modified_on" = now();
RETURN NEW;
END;
$$ language 'plpgsql';
我是否必须在我的函数中编写逻辑并根据结果返回 NULL 或 NEW ,还是有一个简单的解决方案?
答案 0 :(得分:2)
无论新值是否与旧值不同,都会执行UPDATE
,这同样适用于触发器。
三种可能的解决方案:
根据Sevanteri的评论建议,请使用
CREATE TRIGGER update_recipes_timestamp_r
BEFORE UPDATE OF "identifier", "name", "description"
ON recipes FOR EACH ROW
WHEN (OLD IS DISTINCT FROM NEW)
EXECUTE PROCEDURE update_recipe_timestamp_proc();
写下这样的触发程序:
IF (OLD IS DISTINCT FROM NEW) THEN
NEW."modified_on" = now();
RETURN NEW;
END IF;
使UPDATE
有条件:
UPDATE recipes
SET "identifier" = val1, "name" = val2, "description" = val3
WHERE ...
AND "identifier" <> val1 OR "name" <> val2 OR "description" <> val3;
答案 1 :(得分:0)
使用WHEN
的解决方案仅更新特定列更改的 modified_on 列。
CREATE TRIGGER update_recipes_timestamp_r BEFORE
UPDATE ON recipes FOR EACH ROW
WHEN (
OLD."name" <> NEW."name" OR
OLD."description" <> NEW."description" OR
OLD."identifier" <> NEW."identifier")
EXECUTE PROCEDURE update_recipe_timestamp_proc();