É possível capturar uma exceção no plpgsql:
EXCEPTION WHEN unique_violation THEN
Mas como verificar a violação de uma restrição específica?
O exemplo a seguir cria duas chaves: uma for a
e outra for b
. Como saber qual deles causou a exceção?
create table t (
a text unique,
b text unique
);
create procedure insert_t(a text, b text)
language plpgsql
as $$
begin
insert into t values (a, b);
exception when unique_violation then
raise notice 'is it a or b?';
end
$$;
call insert_t('x', 'foo');
call insert_t('x', 'bar');
select * from t;
No manipulador de exceções, você pode obter o nome da restrição violada:
Veja a documentação para detalhes.