Skip site navigation (1) Skip section navigation (2)

Peripheral Links

Header And Logo

PostgreSQL
| The world's most advanced open source database.

Site Navigation

Search archives
  Advanced Search

Re: Listar columnas de la llave primaria


  • From: Oswaldo Hernández <listas(at)soft-com(dot)es>
  • To: Juan Pablo Yañez <jyanez(at)sigma(dot)gov(dot)bo>
  • Cc: pgsql-es-ayuda(at)postgresql(dot)org
  • Subject: Re: Listar columnas de la llave primaria
  • Date: Sat, 20 Aug 2005 12:42:28 +0200
  • Message-id: <43070914.5060607@soft-com.es> <text/plain>

Juan Pablo Yañez escribió:
Hola a todos, necesito saber de que columnas consta la llave primaria de una determinada tabla, lo mas aproximado que encontre para solucionar mi problema fue la funcion pg_get_constraintdef, pero me gustaria saber si alguien tiene una consulta para obtenerlas directamente en forma de cursor o si me pueden idicar por donde debo buscar.

Saludos y muchas gracias de antemano.


Hola,

Abajo te muestro la funcion que hice para obtener una lista de los campos que componen la llave primaria de una tabla. Si le encuentras algun fallo hazmelo saber.

Espero que te sirva, saludos,

--
*****************************************
Oswaldo Hernández
oswaldo(at)soft-com(dot)es
*****************************************



CREATE OR REPLACE FUNCTION describe_pk("varchar", "varchar")
  RETURNS SETOF record AS
$BODY$
/********************************************************************
funcion para obtencion de los campos que componen el indice primario
de una tabla.

Devuelve un registro por cada campo con el nombre y tipo.
Si la tabla no tiene indice primario no devuelve ningun registro.

Uso:

select
	campo,
	tipo
from
	describe_pk('nombre de esquema', 'nombre de tabla')
	as (campo varchar, tipo varchar)
;

Abril 2005 Oswaldo

Posible problema si el indice estuviera formado por una espresion, pero
estas no estan permitidas en las PK

*********************************************************************/
declare
	escenario	alias for $1;
	tabla		alias for $2;
	regret		record;
	pk		record;
begin

-- obtecion de los datos del indice primario de la tabla y oid de tabla y schema
select into pk
 	schemas.oid 		as oid_schema,
 	tablas.oid 		as oid_tabla,
 	indices.indexrelid 	as oid_pk,
 	indices.indkey		as campos,
 	indices.indnatts	as nvectores,
 	indices.indexprs	as expresiones
from
 	pg_class 		as tablas
 	left join pg_namespace 	as schemas
		on tablas.relnamespace = schemas.oid
 	left join pg_index 	as indices
		on tablas.oid = indices.indrelid	
where
	schemas.nspname = escenario
	and tablas.relname = tabla
	and indices.indisprimary = true
;

-- comprueba si existe el indice primario en la tabla
if pk.nvectores > 0 then

	-- bucle de obtencion de datos individuales de los campos desde
	-- las tablas pg_attribute y pg_type
	for i in 0..(pk.nvectores-1) loop
		select into regret
			campo.attname::varchar as campo,
			tipos.typname::varchar	as tipo
		from
			pg_attribute as campo
			join pg_type as tipos
				on campo.atttypid = tipos.oid
		where
			campo.attrelid = pk.oid_tabla and
			campo.attnum = pk.campos[i]
		;
		return next regret;
	end loop;
end if;

return;

end$BODY$
  LANGUAGE 'plpgsql' STABLE SECURITY DEFINER;
ALTER FUNCTION describe_pk("varchar", "varchar") OWNER TO postgres;





Home | Main Index | Thread Index

Privacy Policy | About PostgreSQL
Copyright © 1996 – 2012 PostgreSQL Global Development Group