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
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 |