En Postgres, tengo un activador posterior a la inserción en una tabla particionada que verifica si el registro es único o no. Actualmente, si el registro no es único, el activador genera una excepción. Esto no es lo que quiero porque solo quiero ignorar este caso y actuar como si la inserción realmente hubiera ocurrido.
¿Es posible configurar el disparador para que falle silenciosamente? La transacción circundante no debería fallar, pero la fila no debería insertarse.
Tengo un disparador posterior a la inserción en una tabla particionada que verifica si el registro es único o no.
Puede hacer esto como parte de su declaración de insert , usando la cláusula on conflict do nothing . Esto es más simple y más eficiente que usar un gatillo.
Para que esto funcione, necesita una restricción unique en la columna (o la tupla de columnas) cuya singularidad desea aplicar. Asumiendo que esta es la columna id , harías:
insert into mytable(id, ...) -- enumerate the target columns here values(id, ...) -- enumerate the values to insert here on conflict(id) do nothing Tenga en cuenta que la acción de conflicto do nothing en realidad no requiere especificar un objetivo de conflicto, por lo que estrictamente hablando, podría escribir esto como on conflict do nothing en su lugar. Considero que siempre es una buena idea especificar el objetivo del conflicto, por lo que el alcance está mejor definido.
Si por algún motivo no puede tener un índice único en la columna de destino, otra opción es usar la sintaxis insert ... select junto con una condición de not exists :
insert into mytable(id, ...) select id, ... from (values(id, ...)) t(id, ...) where not exists (select 1 from mytable t1 where t1.id = t.id)