Administração do sistema

SQL - Como identificar o nome da tabela de uma determinada constraint do PostgreSQL?

RT.FAQ-8318
Caso encontrar um erro indicando que não pode criar uma constraint porque ela já existe, é necessário saber qual a tabela que contém esta constraint (ou índice).

Para fazer isso no postgresql, usar a query abaixo:
select tc.relname, ic.relname
from pg_index i
join pg_class ic on ic.oid = i.indexrelid
join pg_class tc on tc.oid = i.indrelid
where ic.relname = lower('regra_pk_505355');

Outro comando para apresentar todas as contraint do banco:
select pgc.conname as constraint_name,
       ccu.table_schema as table_schema,
       ccu.table_name,
       ccu.column_name,
       pgc.consrc as definition
from pg_constraint pgc
join pg_namespace nsp on nsp.oid = pgc.connamespace
join pg_class  cls on pgc.conrelid = cls.oid
left join information_schema.constraint_column_usage ccu
          on pgc.conname = ccu.constraint_name
          and nsp.nspname = ccu.constraint_schema
where contype ='c'
order by pgc.conname;

O campo ic.relname é case sensitive (normalmente minúsculas).

Exemplo de comando para exclusão de uma constraint:
alter table tabela drop constraint nome_constraint;
Onde:

Utilizar o comando o seguinte comando (exemplo) se a constraint for um índice (FKs):
drop index nome_constraint;

Pode ser acrescido ao select acima a expressão para apresentação do comando para exclusão da constraint, como segue:
select 'alter table ' || tc.relname || ' drop constraint ' || ic.relname || ';'
from pg_index i
join pg_class ic on ic.oid = i.indexrelid
join pg_class tc on tc.oid = i.indrelid
where ic.relname = lower('regra_pk_505355');