sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvorfor forhindrer denne regel ikke duplikerede nøgleovertrædelser?

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.



  1. Sådan rydder du alle cachelagrede elementer i Oracle

  2. Sådan gemmer man signatur i MySQL

  3. Hvordan kombinerer man samlede funktioner i MySQL?

  4. Giv brugertilladelser til alle nye tabeller oprettet i postgresql