Postgresql执行更新程序(值已更改)

时间:2017-07-14 09:25:10

标签: postgresql npgsql

我有以下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 ,还是有一个简单的解决方案?

2 个答案:

答案 0 :(得分:2)

无论新值是否与旧值不同,都会执行UPDATE,这同样适用于触发器。

三种可能的解决方案:

  1. 根据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();
    
  2. 写下这样的触发程序:

    IF (OLD IS DISTINCT FROM NEW) THEN
       NEW."modified_on" = now();
       RETURN NEW;   
    END IF;
    
  3. 使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();
相关问题