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