Regler som standard lägg till saker i den aktuella åtgärden :
Men en INSTEAD-regel låter dig ersätta åtgärden:
Så jag tror att du vill att ange Istället :
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;
Utan INSTEAD säger din regel i huvudsak "gör INSERT och gör sedan ingenting" när du vill säga "istället för INSERT, gör ingenting" och, AFAIK, DO INSTEAD NOTHING
kommer att göra det.
Jag är ingen expert på PostgreSQL-regler men jag tror att det borde fungera att lägga till "INSTEAD".
UPPDATERA :Tack vare araqnid vet vi att :
Så en regel kommer inte att fungera i den här situationen. Utlösare aktiveras dock under COPY FROM så du kan skriva ett FÖRE INSERT trigger som skulle returnera NULL när den upptäckte dubbletter av rader:
Som sagt, jag tror att du skulle vara bättre med araqnids "ladda in allt i en tillfällig tabell, rensa upp och kopiera det till slutdestinationen" skulle vara en mer förnuftig lösning för en bulkladdningsoperation som du har.