[Pgsql-ayuda] pkey()

Alvaro Herrera alvherre@dcc.uchile.cl
Sun, 5 Oct 2003 14:39:37 -0400


On Sun, Oct 05, 2003 at 12:58:02PM -0300, Martin Marques wrote:
> Existe una funcion que, dada una tabla, me devuelva el campo PK de diccha 
> tabla?
> Vi que en el PL de Python existe una funcion pkey(), pero creo que no
> se puede usar desde plpgsql, o si?

alvherre=# select * from pg_index where indrelid='blah'::regclass and
indisprimary;
-[ RECORD 1 ]--+------
indexrelid     | 17168
indrelid       | 17165
indkey         | 1
indclass       | 1978
indnatts       | 1
indisunique    | t
indisprimary   | t
indisclustered | f
indexprs       | 
indpred        | 

pg_index.indkey es un oidvector con los attnums de las columnas que
forman la llave primaria (puede ser mas de una).  Tienes que mirar la
tabla pg_attribute para saber que columnas son (attrelid es el OID de la
tabla, attnum es el numero que sale en indkey, y attname es el nombre de
la columna).

En 7.4 existe el information_schema que te ayuda a ubicar esta
información.  Por ejemplo,

alvherre=# select * from information_schema.table_constraints where
table_name='blah' and constraint_type='PRIMARY KEY';

-[ RECORD 1 ]------+------------
constraint_catalog | alvherre
constraint_schema  | public
constraint_name    | blah_pkey
table_catalog      | alvherre
table_schema       | public
table_name         | blah
constraint_type    | PRIMARY KEY
is_deferrable      | NO
initially_deferred | NO

-- 
Alvaro Herrera (<alvherre[a]dcc.uchile.cl>)
You liked Linux a lot when he was just the gawky kid from down the block
mowing your lawn or shoveling the snow. But now that he wants to date
your daughter, you're not so sure he measures up. (Larry Greenemeier)