sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Por qué esta regla no evita las infracciones de claves duplicadas?

Reglas por defecto añadir cosas a la acción actual :

Pero una regla INSTEAD le permite reemplazar la acción:

Entonces, creo que desea para especificar 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;

Sin INSTEAD, su regla esencialmente dice "haga INSERT y luego no haga nada" cuando quiere decir "en lugar de INSERT, no haga nada" y, AFAIK, DO INSTEAD NOTHING hará eso.

No soy un experto en las reglas de PostgreSQL, pero creo que agregar "INSTEAD" debería funcionar.

ACTUALIZAR :Gracias a araqnid sabemos que :

Así que una regla no va a funcionar en esta situación. Sin embargo, los activadores se activan durante COPY FROM, por lo que podría escribir ANTES DE INSERTAR activador que devolvería NULL cuando detectó filas duplicadas:

Dicho esto, creo que sería mejor que araqnid "cargue todo en una tabla temporal, límpielo y cópielo en el destino final" sería una solución más sensata para una operación de carga masiva como la que tiene.