Re: atributo foraneo

From: Anthony Rafael Sotolongo León <asotolongo(at)uci(dot)cu>
To: Jorge Alberto Aquino Andrade <jorge(dot)aquino(dot)andrade(at)gmail(dot)com>
Cc: Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: atributo foraneo
Date: 2014-01-26 20:00:49
Message-ID: 52E56971.9070409@uci.cu
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Jorge lo que me faltó fue agregar el atributo local,creo, bueno para
esto hago un ´parsel´ de la definición del constrait nuevamente para
obtener el atributo local relacionado con la llave foránea, aquí te va
+- lo que logré:

SELECT pg_constraint.conname as nombrellave , pg_class.relname AS tabla,
substring(
pg_get_constraintdef(pg_constraint.oid) from position ('(' in
pg_get_constraintdef(pg_constraint.oid) ) for position (')' in
pg_get_constraintdef(pg_constraint.oid) ) -position ('(' in
pg_get_constraintdef(pg_constraint.oid) )+1 ) as atributolocal,

substring ( pg_get_constraintdef(pg_constraint.oid) from (position
((select a.relname from pg_class a where a.oid=pg_constraint.confrelid)
in pg_get_constraintdef(pg_constraint.oid))) for position(' ON ' in
pg_get_constraintdef(pg_constraint.oid))-position ((select a.relname
from pg_class a where a.oid=pg_constraint.confrelid) in
pg_get_constraintdef(pg_constraint.oid)) ) as atributoforaneo,
(select nspname||'.'||relname from pg_class, pg_namespace where
relnamespace=pg_namespace.oid and pg_class.oid = pg_constraint.confrelid
and relkind='r' ) as esquemaytablaforanea
,
case confmatchtype
when 'u' then 'MATCH simple '
when 'f' then 'MATCH full'
when 'p' then 'MATCH partial'
end as tipo,
case confupdtype
when 'a' then 'no action '
when 'r' then 'restrict'
when 'c' then 'cascade'
when 'n' then 'set null'
else
'default'

end as onupdate ,
case confdeltype
when 'a' then 'no action '
when 'r' then 'restrict'
when 'c' then 'cascade'
when 'n' then 'set null'
else
'default'

end as ondelete
FROM pg_constraint, pg_class
WHERE ( (pg_constraint.contype = 'f'::"char") AND
(pg_constraint.conrelid =
pg_class.oid) and relname='nombretutabla')

saludos

El 1/26/2014 12:49 PM, Jorge Alberto Aquino Andrade escribió:
> Disculpa Anthony, ya vi que que lo que tiene que devolver son las
> relaciones foraneas que tiene la tabla que se le define en
> nombretutaba, yo esperaba que me diera como resultado tal como lo
> habia planteado inicialmente de saber el atributo local que esta
> relacionado con el foraneo, en lo que me enviaste solo esta el
> atributo foraneo, aunque creo que solo lo combinare con lo que yo
> tengo y creo que va funcionar, te cuento luego el resultado, muchas
> gracias por compartir tu conocimiento.
>
>
> 2014-01-26 Jorge Alberto Aquino Andrade
> <jorge(dot)aquino(dot)andrade(at)gmail(dot)com <mailto:jorge(dot)aquino(dot)andrade(at)gmail(dot)com>>
>
> Hola Anthony, fijate que al ejecutar el SQL no me devuelve datos
>
>
> 2014-01-25 Anthony Rafael Sotolongo León <asotolongo(at)uci(dot)cu
> <mailto:asotolongo(at)uci(dot)cu>>
>
> Hola Jorge espero que esto te sirva, solo debes sustituir al
> final de la consulta 'nombretutaba' por nombre de tu tabla:
>
> SELECT pg_constraint.conname as nombrellave , pg_class.relname
> AS tabla,
>
> substring ( pg_get_constraintdef(pg_constraint.oid) from
> (position ((select a.relname from pg_class a where
> a.oid=pg_constraint.confrelid) in
> pg_get_constraintdef(pg_constraint.oid))) for position(' ON '
> in pg_get_constraintdef(pg_constraint.oid))-position ((select
> a.relname from pg_class a where a.oid=pg_constraint.confrelid)
> in pg_get_constraintdef(pg_constraint.oid)) ) as atributoforaneo,
> (select nspname||'.'||relname from pg_class, pg_namespace
> where relnamespace=pg_namespace.oid and pg_class.oid =
> pg_constraint.confrelid and relkind='r' ) as esquemaytablaforanea
> ,
> case confmatchtype
> when 'u' then 'MATCH simple '
> when 'f' then 'MATCH full'
> when 'p' then 'MATCH partial'
> end as tipo,
> case confupdtype
> when 'a' then 'no action '
> when 'r' then 'restrict'
> when 'c' then 'cascade'
> when 'n' then 'set null'
> else
> 'default'
>
> end as onupdate ,
> case confdeltype
> when 'a' then 'no action '
> when 'r' then 'restrict'
> when 'c' then 'cascade'
> when 'n' then 'set null'
> else
> 'default'
>
> end as ondelete
> FROM pg_constraint, pg_class
> WHERE ( (pg_constraint.contype = 'f'::"char") AND
> (pg_constraint.conrelid =
> pg_class.oid) and relname='nombretutaba')
>
>
>
> saludos
>
>
> El 1/25/2014 11:29 AM, Jorge Alberto Aquino Andrade escribió:
>> Lista por favor ayudenme, necesito saber donde obtengo en la
>> base cual es el campo de una llave foranea es decir si tengo esto
>>
>> CONSTRAINT nombre_constraint FOREIGN KEY (atributo1)
>> REFERENCES esquema.tabla2 (atributo2) MATCH SIMPLE
>> ON UPDATE RESTRICT ON DELETE RESTRICT
>>
>> como saber que el atributo1 esta reealacionado con el
>> atributo2 obteniendo nombre de esquemas y tablas respectivos.
>>
>> Nota:
>> Hasta el momento he logrado recurperar todos los atributos de
>> las tablas foraneas que estan ligadas con la tabla primaria
>> pero yo solo deseo el atributo de la tabla foranea que esta
>> ligado con la tabla primaria.
>
>
> ------------------------------------------------------------------------
>
> III Escuela Internacional de Invierno en la UCI del 17 al 28
> de febrero del 2014. Ver www.uci.cu <http://www.uci.cu/>
>
>
>
>

________________________________________________________________________________________________
III Escuela Internacional de Invierno en la UCI del 17 al 28 de febrero del 2014. Ver www.uci.cu

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Freddy Martinez Garcia 2014-01-27 19:12:47 problema con Large Object
Previous Message Jorge Alberto Aquino Andrade 2014-01-26 19:25:27 Re: atributo foraneo