考えられる理由は2つありますが、その理由は...
これらの昇給はどちらもメッセージログに表示されません
ログに記録されていません
まず、NOTICE
通常、デフォルト設定ではデータベースログに書き込まれません。ここでマニュアルを引用します:
log_min_messages
(enum
)サーバーログに書き込むメッセージレベルを制御します。有効な値は
DEBUG5
です。 、DEBUG4
、DEBUG3
、DEBUG2
、DEBUG1
、INFO
、NOTICE
、WARNING
、ERROR
、LOG
、FATAL
、およびPANIC
。 (...)
デフォルトは警告です 。LOG
に注意してください ここでは、client_min_messages
とはランクが異なります。 。
大胆な強調鉱山。別のデフォルトにも注意してください(NOTICE
)client_min_messages
の場合 (マニュアルの前の項目)。
無効なテスト
次に、行式がどのように評価されるかを検討します。テストrow_variable IS NULL
TRUE
を返します if(そしてその場合のみ)すべての単一要素 NULL
です 。次の例を考えます:
SELECT (1, NULL) IS NULL AS a -- FALSE
,(1, NULL) IS NOT NULL AS b -- also FALSE
両方 式はFALSE
を返します 。つまり、行(またはレコード)変数(1, NULL)
NULL
でもありません 、NOT NULL
でもありません 。したがって、両方のテストが失敗します。
-> SQLfiddle 詳細をお知らせします。
CHECK
でのこの動作の詳細、説明、リンク、および可能なアプリケーション この関連する回答の制約:
一連の列に対するNOTNULL制約
NULLを使用してレコード変数を割り当てることもできます(rec := NULL
)、これにより、すべての要素がNULLになります-タイプが既知の行タイプの場合。それ以外の場合は、匿名レコードを処理しており、構造が定義されておらず、最初から要素にアクセスできません。ただし、rowtype
の場合はそうではありません。 あなたの例のように(これは常によく知られています)。
解決策:FOUND
SELECT * INTO
から行を受け取ったかどうかをテストする正しい方法は何ですか ?
行が割り当てられている場合でも、行がNULLになる可能性があることを考慮する必要があります。クエリは、NULL値の束を返す可能性があります(クエリのテーブル定義でNULL値が許可されている場合)。このようなテストは、設計上信頼できません。
シンプルで安全なアプローチがあります。 GET DIAGNOSTICS ...
を使用します または(該当する場合)特別な変数FOUND
:
SELECT * FROM my_table WHERE owner_id = 6 INTO my_var;
IF NOT FOUND THEN
RAISE NOTICE 'Query did not return a row!';
END IF;
マニュアルの詳細。