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:
- tabela = nome da tabela (p.ex.: pessoas)
- nome_constraint = nome da constraint (p.ex.: uk_pessoas_nome)
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');