更新後に行全体が同じままである場合にトリガーをチェックインする方法は?


11

もちろん、次のように比較するすべての列でそれを行うことができます:

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

しかし、たとえば将来的に別の列を追加する場合は、ハードコーディングし、維持するのが困難になります。

個々の列をすべて手動で確認せずに、すべての列が同じかどうかを確認する方法はありますか?


EXCEPTを使用できますか-techonthenet.com/postgresql/except.php
Scott

申し訳ありませんが、私の場合、EXCEPTはどのように使用されますか?古い行と新しい行の値を比較しようとしています。トリガーの新旧のコンテキストではなく、2つのクエリからの既存の行を比較するために使用されているEXCEPTについて知っていることから
Mateus Viccari

私はあなたのdbmsに詳しくありません-select old。*を除いてnew。*を選択する方法はありますか?rowcount = 0の場合、行は変更されません
Scott Hodgin

回答:


15

oldnewを使用しis not distinct fromて、NULL値を正しく処理するレコードを単純に比較できます(すべての列がNOT NULLとして定義されている場合は、単に=またはを使用できます<>)。

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

同じことを実行して、少なくとも1つの列が変更されたかどうかを確認できます。

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

NULLはこれらの条件によってどのように処理されますか?
ypercubeᵀᴹ

@ypercubeᵀᴹ:良い点。回答を更新しました。
a_horse_with_no_name 16

Thnx。簡単に確認したところ、とold=newまったく同じように処理されているようold is not distinct from oldです。つまり、old=new結果がNULLになるケースを見つけることができませんでした。期待していなかった!
ypercubeᵀᴹ

違いはあると思いますが、old <> new完全にはわかりません。
a_horse_with_no_name 16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.