Carregando...
Sem categoria

Descobrindo todas as colunas que fazem referência à outra no PostgreSQL

Como descobrir qual coluna de certa tabela é referenciado por outras de outras tabelas?

Em outras palavras, quais colunas de uma tabela tem FOREIGN KEYS/REFERENCES em outras?

Se você está procurando isso, provavelmente terá interesse neste post sobre o CASCADE. O CASCADE apaga ou atualiza todas as colunas que são FOREIGN KEY automaticamente.

Use a consulta abaixo e descubra!
Basta alterar o ‘public’, ‘usuarios’ e ‘id’ pelos valores desejados:

WITH params AS (
	SELECT 
	'public' AS schema_name,
	'usuarios' AS table_name,
	'id' AS column_name
)
SELECT 
-- CONSTRAINT data
r.constraint_schema, r.constraint_name, 
-- FOREIGN KEY data (the column that references another one)
r.table_schema fk_schema, r.table_name fk_table, r.column_name fk_column, r.ordinal_position fk_ordinal_position,
-- REFERENCES data (the column which is referenced)
params.schema_name ref_schema, params.table_name ref_table, params.column_name ref_column
FROM information_schema.constraint_column_usage u
INNER JOIN information_schema.referential_constraints fk
    ON u.constraint_catalog = fk.unique_constraint_catalog
    AND u.constraint_schema = fk.unique_constraint_schema
    AND u.constraint_name = fk.unique_constraint_name
INNER JOIN information_schema.key_column_usage r
    ON r.constraint_catalog = fk.constraint_catalog
    AND r.constraint_schema = fk.constraint_schema
    AND r.constraint_name = fk.constraint_name
INNER JOIN params 
	ON TRUE
    AND u.table_schema IN (params.schema_name)
    AND u.table_name IN (params.table_name)
    AND u.column_name IN (params.column_name)
;

Atenção, essa consulta só funciona para versões mais modernas do PostgreSQL. Isso porque versões mais antigas não têm constraints de nome único.

Referências

Discussão no Stack Overflow
https://stackoverflow.com/questions/5347050/postgresql-sql-script-to-get-a-list-of-all-tables-that-has-a-particular-column

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *