sql >> Databasteknik >  >> RDS >> PostgreSQL

Varför förhindrar inte denna regel dubbletter av nyckelöverträdelser?

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.



  1. PostgreSQL med ägarproblem för hamnarbetare

  2. funktion för att kontrollera om SQLite använder journal_mode=WAL eller journal_mode=DELETE

  3. Exklusiv! Gå med oss ​​med vår gäst Michal Bar, Access Program Manager

  4. ScaleGrid DBaaS utökar MySQL-värdtjänster genom AWS Cloud