Re: PK en catalogos

From: "Edwin Perez" <edwinandperez(at)gmail(dot)com>
To: "Alvaro Herrera" <alvherre(at)commandprompt(dot)com>
Cc: "Miguel Ortega" <mortega(at)tc(dot)com(dot)ve>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: PK en catalogos
Date: 2007-07-03 20:07:50
Message-ID: a8e030e90707031307x46a95e59vb53ca26e127c254c@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

>WHERE table_name='%nombre_de_la_tabla%'

no es ningun like ni nada por el estilo solo remplaza el
%nombre_de_la_tabla% por el nombre de la tabla y yap:

SELECT constraint_name, column_name, ordinal_position
FROM information_schema.key_column_usage
WHERE table_name='usuarios' and
position_in_unique_constraint IS NULL;

El 2/07/07, Alvaro Herrera <alvherre(at)commandprompt(dot)com> escribió:
> 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)
> --
> ---------------------------(fin del mensaje)---------------------------
> TIP 1: para suscribirte y desuscribirte, visita
> http://archives.postgresql.org/pgsql-es-ayuda
>

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Paul Gallegos 2007-07-03 20:18:30 Re: ¿¿Porque PostgreSQL??
Previous Message Gabriel Hermes Colina Zambra 2007-07-03 20:02:33 Re: ¿¿Porque PostgreSQL??