reglas por defecto: add things to the current action
En términos generales, una regla hace que los comandos adicionales que se ejecutarán cuando se ejecuta una orden dada en una tabla dada.
Pero una regla VEZ le permite reemplazar la acción:
Alternativamente, una regla en su lugar puede sustituir a una orden dada por otro, o causar una orden de no ser ejecutado en absoluto.
Por lo tanto, creo que quiere to specify 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 el cambio, su regla es esencialmente diciendo "el inserto y luego no hacer nada" cuando se quiere decir "en lugar del inserto, no hacer nada "y, AFAIK, el DO INSTEAD NOTHING
hará eso.
No soy un experto en reglas de PostgreSQL, pero creo que agregar el "INSTEAD" debería funcionar.
ACTUALIZACIÓN: Gracias a araqnid we know that:
COPIA DE invocará cualquier disparador y comprobar las restricciones en la tabla de destino. Sin embargo, no invocará las reglas
De modo que una regla no funcionará en esta situación. Sin embargo, los disparadores se activan durante COPIA DE por lo que podría escribir una antes de insertar trigger that would return NULL cuando se detecta filas duplicadas:
puede devolver NULL para omitir la operación de la fila actual. Esto instruye al ejecutor a no realizar la operación de nivel de fila que invocó el desencadenador (la inserción o modificación de una fila de tabla particular).
Dicho esto, creo que estaría mejor con araqnid de "cargar todo en una tabla temporal, limpiarlo, y copiarlo en el destino final" sería una solución más sensata para una carga a granel operación como tú.
Esto funcionaría para las instrucciones INSERT reales, pero no COPIA. – araqnid
@araqnid: "COPY FROM invocará cualquier activador y verificará las restricciones en la tabla de destino. Sin embargo, no invocará reglas". Sin embargo, podría usar un desencadenante BEFORE INSERT y devolver NULL para omitir los duplicados. OTOH, los disparadores probablemente no sean la mejor herramienta para lidiar con la carga masiva de datos. –