0

我有一个表 foo,里面有一个文本字段栏。在那张桌子上,我有一个更新后触发器,基本上如下:


CREATE OR REPLACE FUNCTION update_foo() 
RETURNS TRIGGER
SECURITY DEFINER
AS
$_$
DECLARE 
BEGIN
  IF TG_OP = 'UPDATE' and NEW.bar = OLD.bar THEN
    return NEW;
  END IF;

  /* Do some stuff */

END
$_$
LANGUAGE PLPGSQL;

然后我做这样的事情: Update foo set bar = bar || '';

但是当文本值相等时它不会保释。

我的问题是,为什么 PostgreSQL 8.3,特别是 pl/PgSQL 不称它们为平等并尽早退出?

免责声明:表、字段和变量名称已从其原始名称更改,以允许在线发布。

4

1 回答 1

3

这将是因为其中一个值是空值。并且 null 不能等于任何其他值,

所以你需要添加额外的标准

(New.bar is  null or Old.bar is null)

或者

  NEW.bar is not distinct from OLD.bar
于 2012-04-26T23:02:26.027 回答