デフォルトのルール
ただし、INSTEADルールを使用すると、アクションを置き換えることができます。
したがって、INSTEADを指定する 必要があると思います。 :
CREATE OR REPLACE RULE ignore_duplicate_inserts AS
ON INSERT TO mytable
WHERE (EXISTS ( SELECT mytable.id
FROM mytable
WHERE mytable.id = new.id)) DO INSTEAD NOTHING;
INSTEADがない場合、「INSERTの代わりに何もしない」と言いたい場合、ルールは基本的に「INSERTを実行してから何もしない」と言い、AFAIK、DO INSTEAD NOTHING
私はPostgreSQLルールの専門家ではありませんが、「INSTEAD」を追加することでうまくいくと思います。
更新 :araqnid ありがとうございます :
したがって、この状況ではルールは機能しません。ただし、トリガーはCOPY FROM中に発生するため、BEFORE INSERT NULLを返すトリガー 重複行を検出したとき:
そうは言っても、araqnidの「すべてを一時テーブルにロードし、クリーンアップして、最終的な宛先にコピーする」方が、あなたのような一括ロード操作のより賢明な解決策になると思います。