Fórum [DÚVIDA] SELECT CHAVE ESTRANGEIRA #26984
25/11/2008
0
Bom pessoal!
Sou iniciante no postgres, e estou com um pequeno grande problema:
Tenho 2 tabelas.
Como fazer um select para buscar o nome da chave estrangeira, o nome da tabela, o nome da coluna, o nome da tabela referenciada, e o nome da coluna referenciada?
No MySql, Sql tem todas essas colunas estão em uma view apenas, mas no postgre está em views ou catálogos diferentes... não estou conseguindo relacionar um com o outro...
Se alguém puder me dar uma mãozinha, eu agradeço!
Valeus
Sou iniciante no postgres, e estou com um pequeno grande problema:
Tenho 2 tabelas.
Como fazer um select para buscar o nome da chave estrangeira, o nome da tabela, o nome da coluna, o nome da tabela referenciada, e o nome da coluna referenciada?
No MySql, Sql tem todas essas colunas estão em uma view apenas, mas no postgre está em views ou catálogos diferentes... não estou conseguindo relacionar um com o outro...
Se alguém puder me dar uma mãozinha, eu agradeço!
Valeus
Maskara_121
Curtir tópico
+ 0
Responder
Posts
28/11/2008
Jair Bg
Bom Dia, coisa simples é (+-) assim pelo que pude entender:
SELECT DISTINCT
ON (pg_constraint.conname
, pg_type1.typname
, pg_attribute1.attname)
pg_constraint.conname AS nome_chave
, pg_type1.typname AS tabela_p
, pg_attribute1.attname AS campo_p
, pg_type2.typname AS tabela_fk
, pg_attribute2.attname AS campo_fk
, pg_get_constraintdef(pg_constraint.oid, TRUE) AS chave_estrangeira
FROM pg_constraint
INNER JOIN pg_type pg_type1
ON (pg_type1.typrelid = pg_constraint.conrelid)
INNER JOIN pg_type pg_type2
ON (pg_type2.typrelid = pg_constraint.confrelid)
INNER JOIN pg_attribute pg_attribute1
ON (pg_attribute1.attrelid = pg_constraint.conrelid)
AND (pg_attribute1.attnum = ANY (pg_constraint.conkey))
INNER JOIN pg_attribute pg_attribute2
ON (pg_attribute2.attrelid = pg_constraint.confrelid)
AND (pg_attribute2.attnum = ANY (pg_constraint.confkey))
WHERE (pg_constraint.contype = ´f´)
Ninguem trabalha porquê gosta, trabalho é o meio que utilizamos para realizar algo, originado de ideias ou desafios.
SELECT DISTINCT
ON (pg_constraint.conname
, pg_type1.typname
, pg_attribute1.attname)
pg_constraint.conname AS nome_chave
, pg_type1.typname AS tabela_p
, pg_attribute1.attname AS campo_p
, pg_type2.typname AS tabela_fk
, pg_attribute2.attname AS campo_fk
, pg_get_constraintdef(pg_constraint.oid, TRUE) AS chave_estrangeira
FROM pg_constraint
INNER JOIN pg_type pg_type1
ON (pg_type1.typrelid = pg_constraint.conrelid)
INNER JOIN pg_type pg_type2
ON (pg_type2.typrelid = pg_constraint.confrelid)
INNER JOIN pg_attribute pg_attribute1
ON (pg_attribute1.attrelid = pg_constraint.conrelid)
AND (pg_attribute1.attnum = ANY (pg_constraint.conkey))
INNER JOIN pg_attribute pg_attribute2
ON (pg_attribute2.attrelid = pg_constraint.confrelid)
AND (pg_attribute2.attnum = ANY (pg_constraint.confkey))
WHERE (pg_constraint.contype = ´f´)
Ninguem trabalha porquê gosta, trabalho é o meio que utilizamos para realizar algo, originado de ideias ou desafios.
Responder
Gostei + 0
02/12/2008
Jair Bg
desculpe, cometi um erro, o código de consulta correto para buscar os campos da foreing key é:
SELECT pg_constraint.conname AS nome_chave
, pg_type1.typname AS tabela_p
, pg_attribute1.attname AS campo_p
, pg_description1.description AS desc_p
, pg_type2.typname AS tabela_fk
, pg_attribute2.attname AS campo_fk
, pg_description2.description AS desc_fk
, pg_get_constraintdef(pg_constraint.oid, TRUE) AS chave_estrangeira
FROM pg_constraint
INNER JOIN pg_type pg_type1
ON (pg_type1.typrelid = pg_constraint.conrelid)
INNER JOIN pg_type pg_type2
ON (pg_type2.typrelid = pg_constraint.confrelid)
INNER JOIN pg_attribute pg_attribute1
ON (pg_attribute1.attrelid = pg_constraint.conrelid)
AND (pg_attribute1.attnum = ANY (pg_constraint.conkey))
INNER JOIN pg_description pg_description1
ON (pg_description1.objoid = pg_attribute1.attrelid)
AND (pg_description1.objsubid = pg_attribute1.attnum)
INNER JOIN pg_attribute pg_attribute2
ON (pg_attribute2.attrelid = pg_constraint.confrelid)
AND (pg_attribute2.attnum = pg_constraint.confkey[
INDEX(CAST(ARRAY_TO_STRING(pg_constraint.conkey, ´.´) AS ltree),
CAST(CAST(pg_attribute1.attnum AS VARCHAR) AS ltree)) + 1])
INNER JOIN pg_description pg_description2
ON (pg_description2.objoid = pg_attribute2.attrelid)
AND (pg_description2.objsubid = pg_attribute2.attnum)
WHERE (pg_constraint.contype = ´f´)
AND (pg_constraint.conname LIKE ´fk_¬´)
ORDER BY pg_constraint.conname
, pg_type1.typname
, pg_attribute1.attname
.
SELECT pg_constraint.conname AS nome_chave
, pg_type1.typname AS tabela_p
, pg_attribute1.attname AS campo_p
, pg_description1.description AS desc_p
, pg_type2.typname AS tabela_fk
, pg_attribute2.attname AS campo_fk
, pg_description2.description AS desc_fk
, pg_get_constraintdef(pg_constraint.oid, TRUE) AS chave_estrangeira
FROM pg_constraint
INNER JOIN pg_type pg_type1
ON (pg_type1.typrelid = pg_constraint.conrelid)
INNER JOIN pg_type pg_type2
ON (pg_type2.typrelid = pg_constraint.confrelid)
INNER JOIN pg_attribute pg_attribute1
ON (pg_attribute1.attrelid = pg_constraint.conrelid)
AND (pg_attribute1.attnum = ANY (pg_constraint.conkey))
INNER JOIN pg_description pg_description1
ON (pg_description1.objoid = pg_attribute1.attrelid)
AND (pg_description1.objsubid = pg_attribute1.attnum)
INNER JOIN pg_attribute pg_attribute2
ON (pg_attribute2.attrelid = pg_constraint.confrelid)
AND (pg_attribute2.attnum = pg_constraint.confkey[
INDEX(CAST(ARRAY_TO_STRING(pg_constraint.conkey, ´.´) AS ltree),
CAST(CAST(pg_attribute1.attnum AS VARCHAR) AS ltree)) + 1])
INNER JOIN pg_description pg_description2
ON (pg_description2.objoid = pg_attribute2.attrelid)
AND (pg_description2.objsubid = pg_attribute2.attnum)
WHERE (pg_constraint.contype = ´f´)
AND (pg_constraint.conname LIKE ´fk_¬´)
ORDER BY pg_constraint.conname
, pg_type1.typname
, pg_attribute1.attname
.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)