Aturan secara default tambahkan hal-hal ke tindakan saat ini :
Tetapi aturan BUKAN memungkinkan Anda untuk mengganti tindakan:
Jadi, saya rasa Anda ingin menentukan BUKAN :
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;
Tanpa BUKAN, aturan Anda pada dasarnya mengatakan "lakukan INSERT dan kemudian lakukan apa-apa" ketika Anda ingin mengatakan "alih-alih INSERT, jangan lakukan apa-apa" dan, AFAIK, DO INSTEAD NOTHING
akan melakukannya.
Saya bukan ahli dalam aturan PostgreSQL, tetapi saya pikir menambahkan "BUKAN" akan berhasil.
PERBARUI :Terima kasih kepada araqnid kami tahu itu :
Jadi aturan tidak akan bekerja dalam situasi ini. Namun, pemicu dipicu selama SALIN DARI sehingga Anda dapat menulis SEBELUM MASUKKAN pemicu yang akan mengembalikan NULL ketika mendeteksi baris duplikat:
Yang mengatakan, saya pikir Anda akan lebih baik dengan araqnid "muat semuanya ke dalam tabel sementara, bersihkan, dan salin ke tujuan akhir" akan menjadi solusi yang lebih masuk akal untuk operasi pemuatan massal seperti yang Anda miliki.