2012-04-26 21 views
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がそれらを等価と呼び、早期に退会するのかということです。

免責条項:表、フィールド、および変数名は、オンラインからの転記を可能にするため、元のものから変更されています。

答えて

3

これは値の1つがnullであるためです。 とnullが他のどの値に等しくすることはできません、

だからあなたは余分な基準

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

それとも

NEW.bar is not distinct from OLD.bar 
+0

を追加する必要がありますが、私が影響を与えたいくつかのNULLフィールドを持っていたが判明します重要なフィールドで物事が変更されたかどうかをチェックします。 – bitcycle