Правила по подразбиране добавяне на неща към текущото действие :
Но правило ВМЕСТО ви позволява да замените действието:
И така, мисля, че искате да посочите ВМЕСТО :
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, но мисля, че добавянето на „ВМЕСТО“ трябва да свърши работа.
АКТУАЛИЗАЦИЯ :Благодарение на araqnid знаем това :
Така че правилото няма да работи в тази ситуация. Въпреки това тригерите се задействат по време на COPY FROM, така че можете да напишете ПРЕДИ ВМЪКВАНЕ тригер, който би върнал NULL когато открие дублиращи се редове:
Въпреки това мисля, че би било по-добре с araqnid „заредете всичко във временна таблица, почистете го и го копирайте до крайната дестинация“ би било по-разумно решение за операция за групово зареждане, както имате.