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.