gpt4 book ai didi

Postgresql 在更新时执行过程(值已更改)

转载 作者:行者123 更新时间:2023-11-29 12:55:10 28 4
gpt4 key购买 nike

我有以下 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';

我是否必须在函数中编写逻辑并根据结果返回 NULLNEW 还是有简单的解决方案?

最佳答案

无论新值是否与旧值不同,都会执行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;

关于Postgresql 在更新时执行过程(值已更改),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45099344/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com