Estoy haciendo una inserción masiva de registros en una base de datos desde un archivo de registro. Ocasionalmente (~ 1 fila de cada mil) una de las filas viola la clave principal y hace que la transacción falle. Actualmente, el usuario tiene que pasar manualmente por el archivo que causó la falla y eliminar la fila ofensiva antes de intentar volver a importar. Dado que hay cientos de estos archivos para importar, no es práctico.Continuación de una transacción después del error de violación de clave primaria
Mi pregunta: ¿Cómo puedo omitir la inserción de registros que se viole la restricción de clave primaria, sin tener que hacer una declaración SELECT
antes de cada fila para ver si ya existe?
Nota: Conozco la pregunta muy similar #1054695, pero parece ser una respuesta específica de SQL Server y estoy usando PostgreSQL (importando a través de Python/psycopg2).
Eso no va a funcionar, cuando ocurre un error, la transacción se cancela y se revierte. Necesita un manejador de excepciones dentro de la base de datos. Consulta fallida: ERROR: la transacción actual se cancela, los comandos se ignoran hasta el final del bloque de transacción –
Sí lo hará. Ese es el objetivo de SAVEPOINTs. He editado mi respuesta para dar un ejemplo concreto. –
---- editar ---- Lo siento, estaba equivocado ... lástima de mí;) Funciona bien, tienes razón. –