在postgresql中,如果行(NEW.*)与行(OLD.*)不同,则如何工作

pjngdqdw  于 2022-11-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(230)

这段代码是如何工作的。NEW.* 和OLD.* 是多余的吗?为什么不直接使用NEW.created_at〈〉OLD.created

-- always reset the timestamp to the old value ("actual creation time")
CREATE OR REPLACE FUNCTION before_update_users()
  RETURNS trigger AS
$BODY$
BEGIN
  -- always reset the timestamp to the old value ("actual creation time")
  IF row(NEW.*) IS DISTINCT FROM row(OLD.*) THEN
      NEW.created_at := OLD.created_at;
      NEW.updated_at = now();
      RETURN NEW;
   ELSE
      RETURN OLD;
   END IF;
END;
$BODY$

谢谢

j2cgzkjk

j2cgzkjk1#

即使这个触发器函数是由UPDATE触发的,它也不意味着对行实际进行的更改。row(NEW.)IS DISTINCT FROM行(OLD.)用于检测NEW行中是否有任何值实际上不同于OLD行中的任何值。如果是,则将updated_at更新为当前时间以注册更新时间。created_at保持不变,因此将传递给NEW行。
NEW.created_at〈〉OLD.created_at只比较行的NEW版本和OLD版本中的一列,在将行作为整体进行比较时没有用。此外,如果其中一个值(或两个值)为空,表达式将永远不会计算为真。Is distinct将空值视为实际值,并进行相应的比较。
您可以在此处找到有关行比较的详细信息:https://www.postgresql.org/docs/current/functions-comparisons.html#ROW-WISE-COMPARISON

相关问题