Regler som standard føje ting til den aktuelle handling :
Men en INSTEAD-regel giver dig mulighed for at erstatte handlingen:
Så jeg tror, du vil angive I STEDET :
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;
Uden INSTEAD siger din regel i det væsentlige "gør INSERT, og gør derefter ingenting", når du vil sige "i stedet for INSERT, gør ingenting" og, AFAIK, DO INSTEAD NOTHING
vil gøre det.
Jeg er ikke ekspert i PostgreSQL-regler, men jeg tror, at tilføjelse af "INSTEAD" burde virke.
OPDATERING :Takket være araqnid ved vi det :
Så en regel vil ikke fungere i denne situation. Triggere udløses dog under COPY FROM, så du kan skrive en FØR INSERT trigger, der ville returnere NULL når den opdagede dublerede rækker:
Når det er sagt, tror jeg, at du ville være bedre stillet med araqnids "indlæs det hele i en midlertidig tabel, ryd det op og kopier det til den endelige destination" ville være en mere fornuftig løsning til en bulk loading operation, som du har.