2016-03-21 18 views
0

私はAFTER UPDATEというトリガーを持っています。私にはうまくいかない状態がありますが、どうすれば修正できますか?なぜトリガでは反対の操作<が動作しませんか?

$$ 
BEGIN 
    IF NEW.colname <> OLD.colname THEN 
     DELETE FROM tableX WHERE id = OLD.id; 
    END IF; 
END 
$$ 

私はDELETEクエリが動作することを、このIF 1 THENを書く場合は注意すべきです。だから問題はその状態です。どうしたの?


として@DarwinフォンCoraxこれらNEW.colnameのいずれか、OLD.colnameがその条件のすべてがfalseを返し、nullである場合、コメントで述べています。だから私はこのような行動をする条件をどのように作り出すことができるのか知りたいですか?

Null <> 10  -- true 
Null <> Null  -- false 
10 <> 12   -- true 
32 <> Null  -- true 
3 <> 3   -- false 
+2

「NEW.colname」または「OLD.colname」のいずれかが** 'null' **ですか?もしそうなら、 '<>'は** 'null' **を返します。これは、' 'if''が**' false' **と同じ扱いになります。 –

+0

@DarwinvonCoraxああ、あなたは正しいのですが、私はそれをテストしました。その値の1つが「null」の場合、その条件は機能しません。それで解決策はありますか? – stack

+0

はい。ちょっと待ってください。 –

答えて

2

NEW.colnameOLD.colnameいずれかがnullであれば、<>iffalseと同じように扱っていましたnullを返します。

幸いにも、ソリューションがある:一つだけである場合、両方のオペランドがnull0であれば1を返し<=>(NULLセーフ等価)演算子は、。式

IF NOT (NEW.colname <=> OLD.colname) THEN 

は、必要な処理を行う必要があります。

1

null条件を確認するロジックを追加するだけです。両方の列がnullの場合、変更は発生しません。

$$ 
BEGIN 
    IF 
     -- when exactly one of the column is null 
     NEW.colname is not null and OLD.colname is null or 
     NEW.colname is null and OLD.colname is not null or 
     -- when both are not null compare their values 
     NEW.colname is not null and OLD.colname is not null and NEW.colname <> OLD.colname THEN 
     DELETE FROM tableX WHERE id = OLD.id; 
    END IF; 
END 
$$ 
+0

ああ、これは長い条件なので、あなたは 'または'を使用しているのでほとんど動作しないと思いますので、この部分の 'NEW.colnameがヌルでなく、OLD.colnameがヌル'ならば 'true'になりますIFの結果もまた真実です...私が必要とするものではありません。 – stack

+0

@stack、列の1つがヌルであるときにうまく起動しますが、それはあなたが望むものではありませんか? –

+0

いいえいいえ...違いがあるときだけ、その 'DELETE'クエリを実行したいです。私の更新版の例を見てください。 – stack

関連する問題