这段代码是如何工作的。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$
谢谢
1条答案
按热度按时间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