Re: PK en catalogos

From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Miguel Ortega <mortega(at)tc(dot)com(dot)ve>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: PK en catalogos
Date: 2007-07-03 01:37:15
Message-ID: 20070703013715.GA9124@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Miguel Ortega escribió:
> Gracias a todos por sus respuestas... El fin de semana llegue a esto:
>
> SELECT a.attname AS campo_pk FROM pg_catalog.pg_attribute AS a
> WHERE a.attrelid = oid_tabla --Esto es un parametro (Este select
> es parte de una funcion en pg/plsql)
> AND EXISTS (SELECT TRUE FROM pg_catalog.pg_constraint
> WHERE conrelid=oid_tabla AND contype='p' AND
> a.attnum = ANY(conkey))
>
> Saludos.... Espero alguien tome las opciones y logre determinar cual es
> la más positiva (Yo no tengo ni idea de como averiguar cual es la más
> óptima)

Una cosa ... Mas facil que estar pasando el OID de la tabla, es usar el
tipo regclass. Puedes hacer cosas asi:

SELECT a.attname AS campo_pk FROM pg_catalog.pg_attribute AS a
WHERE a.attrelid = 'nombre-tabla'::regclass
AND EXISTS (SELECT TRUE FROM pg_catalog.pg_constraint
WHERE conrelid='nombre-tabla'::regclass AND contype='p' AND
a.attnum = ANY(conkey))

Lo bueno es que funciona incluso si calificas el nombre de la tabla, por
ej. puedes pasarle un nombre del estilo "miesquema.tabla", o simplemente
el nombre de la tabla (y va a tomar la tabla que sea visible segun el
search_path).

Lo otro, por que no expresarlo como un JOIN comun y corriente, algo asi:

SELECT a.attnum, a.attname
FROM pg_attribute a JOIN pg_constraint c ON
(a.attnum = ANY(c.conkey) AND a.attrelid = c.conrelid)
WHERE a.attrelid = 'nombre-tabla'::regclass AND contype = 'p';

Ejemplo:

alvherre=# create schema foobar;
CREATE SCHEMA
alvherre=# create table foobar.barbaz (a int, b text, c timestamp with time zone, primary key (a, c));
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "barbaz_pkey" for table "barbaz"
CREATE TABLE

alvherre=# SELECT a.attname
FROM pg_attribute a JOIN pg_constraint c ON
(a.attnum = ANY(c.conkey) AND a.attrelid = c.conrelid)
WHERE a.attrelid = 'foobar.barbaz'::regclass AND contype = 'p';
attname
---------
a
c
(2 rows)

--
Alvaro Herrera http://www.amazon.com/gp/registry/5ZYLFMCVHXC
"Doing what he did amounts to sticking his fingers under the hood of the
implementation; if he gets his fingers burnt, it's his problem." (Tom Lane)

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jaime Casanova 2007-07-03 02:05:53 Re: Error al ejecutar una funcion con commit
Previous Message Ernesto Quiñones 2007-07-03 01:02:50 postgresql sobre aix