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

Perché questa regola non impedisce le violazioni delle chiavi duplicate?

Regole per impostazione predefinita aggiunge elementi all'azione corrente :

Ma una regola INVECE ti permette di sostituire l'azione:

Quindi, penso che tu voglia specificare INSTEAD :

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;

Senza INSTEAD, la tua regola consiste essenzialmente nel dire "fai INSERT e poi non fare nulla" quando vuoi dire "invece di INSERT, non fare nulla" e, AFAIK, il DO INSTEAD NOTHING lo farà.

Non sono un esperto di regole PostgreSQL ma penso che l'aggiunta di "INSTEAD" dovrebbe funzionare.

AGGIORNAMENTO :Grazie ad araqnid sappiamo che :

Quindi una regola non funzionerà in questa situazione. Tuttavia, i trigger vengono attivati ​​durante COPY FROM in modo da poter scrivere un BEFORE INSERT trigger che restituirebbe NULL quando ha rilevato righe duplicate:

Detto questo, penso che faresti meglio con "caricalo tutto in una tabella temporanea, ripuliscilo e copialo nella destinazione finale" di araqnid sarebbe una soluzione più sensata per un'operazione di caricamento in blocco come hai fatto tu.