PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Warum verhindert diese Regel keine Verstöße gegen doppelte Schlüssel?

Regeln fügen standardmäßig Dinge zur aktuellen Aktion hinzu :

Aber eine INSTEAD-Regel ermöglicht es Ihnen, die Aktion zu ersetzen:

Ich denke also, Sie möchten INSTEAD angeben :

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;

Ohne das STATT sagt Ihre Regel im Wesentlichen "mach das EINFÜGEN und dann nichts", wenn du sagen willst "statt des EINFÜGENS tust du nichts" und, AFAIK, das DO INSTEAD NOTHING werde das tun.

Ich bin kein Experte für PostgreSQL-Regeln, aber ich denke, das Hinzufügen von "INSTEAD" sollte funktionieren.

AKTUALISIEREN :Dank araqnid wissen wir das :

Eine Regel wird in dieser Situation also nicht funktionieren. Trigger werden jedoch während COPY FROM ausgelöst, sodass Sie ein BEFORE INSERT schreiben könnten Trigger, der NULL zurückgeben würde wenn doppelte Zeilen erkannt wurden:

Das heißt, ich denke, Sie wären besser dran, wenn araqnids "alles in eine temporäre Tabelle laden, aufräumen und an das endgültige Ziel kopieren" eine sinnvollere Lösung für einen Massenladevorgang wie Sie wäre.