如何在更新后检查触发器是否整个行都保持不变?


11

当然,我可以像这样比较每列:

if (old.column1 = new.column1 and old.column2 = new.column2...)

但是,例如,如果将来我再添加另一列,它将很难编码并且难以维护。

有没有一种方法可以检查所有列是否保持相同而无需手动检查每个单独的列?



抱歉,在我的情况下如何使用EXCEPT?我正在尝试将旧行与新行值进行比较,据我所知,它用于比较两个查询中的现有行,而不是在触发器的旧/新上下文中...
Mateus Viccari

我对您的dbms不熟悉-是否可以选择new。*,但选择old。*除外?如果rowcount = 0,则没有行更改
Scott Hodgin

Answers:


15

您可以直接比较old和正确new使用is not distinct fromNULL值的记录(如果所有列均定义为NOT NULL,则可以简单地使用=<>

if old is not distinct from new then 
   .... do something
end if;

可以执行相同的操作来检查是否至少更改了一列:

if old is distinct from new then 
   .... do something
end if;

这些条件如何处理NULL?
ypercubeᵀᴹ

@ypercubeᵀᴹ:好点。我更新了答案。
a_horse_with_no_name

谢谢 我进行了快速检查,似乎old=new处理该案件的方式完全相同old is not distinct from old。换句话说,我找不到old=new给出NULL结果的情况。没想到!
ypercubeᵀᴹ

我认为会有不同,old <> new但是我不确定。
a_horse_with_no_name
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.