Reguły domyślnie dodają elementy do bieżącej akcji :
Ale reguła INSTEAD pozwala zastąpić akcję:
Myślę więc, że chcesz określić ZAMIAST :
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;
Bez INSTEAD, twoja reguła zasadniczo mówi "zrób WSTAW, a następnie nic nie rób", gdy chcesz powiedzieć "zamiast WSTAW, nic nie rób" i, AFAIK, DO INSTEAD NOTHING
zrobi to.
Nie jestem ekspertem w zakresie reguł PostgreSQL, ale myślę, że dodanie "ZAMIAST" powinno zadziałać.
AKTUALIZUJ :Dzięki araqnid wiemy o tym :
Więc reguła nie zadziała w tej sytuacji. Jednak wyzwalacze są uruchamiane podczas KOPIUJ Z, więc możesz napisać PRZED WSTAWIENIEM wyzwalacz, który zwróci NULL kiedy wykrył zduplikowane wiersze:
To powiedziawszy, myślę, że lepiej byłoby, gdyby araqnid „załaduj to wszystko do tabeli tymczasowej, wyczyść i skopiuj do miejsca docelowego” byłoby bardziej rozsądnym rozwiązaniem dla operacji ładowania zbiorczego, takiej jak ty.