Re: determiner les champ de clef primaire d'une

Lists: pgsql-fr-generale
From: Laurent Mesuré <laurent(dot)mesure(at)free(dot)fr>
To: pgsql-fr-generale <pgsql-fr-generale(at)postgresql(dot)org>
Subject: determiner les champ de clef primaire d'une table
Date: 2006-05-31 21:06:18
Message-ID: 447E054A.2020506@free.fr
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

Bonjur,

ayant une table je voudrais extraire la liste des champs de la clef
primaire.

j'"essaye avec les tables pg_class,pg_index, mais du coup je me trouve
confronté au type int2vector. Du coup, je suis sur qu'il y a surement
une methode plus simple, mais je ne la trouve pas.

Si quelqu'un a une idée

Merci

Laurent


From: Stéphane BUNEL <stephane(at)stratum-ip(dot)net>
To: Laurent Mesuré <laurent(dot)mesure(at)free(dot)fr>
Cc: pgsql-fr-generale <pgsql-fr-generale(at)postgresql(dot)org>
Subject: Re: determiner les champ de clef primaire d'une
Date: 2006-06-02 08:22:28
Message-ID: 447FF544.6030709@stratum-ip.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

Laurent Mesuré a écrit :
> Bonjur,

Bonjour,

> ayant une table je voudrais extraire la liste des champs de la clef
> primaire.
>
> j'"essaye avec les tables pg_class,pg_index, mais du coup je me trouve
> confronté au type int2vector. Du coup, je suis sur qu'il y a surement
> une methode plus simple, mais je ne la trouve pas.
>
>
> Si quelqu'un a une idée

Quelle version de PG utilisez-vous ?

Quel est votre contexte ? Pour un besoin _ponctuel_, psql vous
renseignera par la commande \d <nom_table>. De là un grep peux suffire à
isoler les informations recherchés.

ex:

safari=# \d library
Table "public.library"
Column | Type | Modifiers
--------+------+-----------
key | text | not null
value | text |
Indexes:
"library_pkey" PRIMARY KEY, btree ("key")


From: Laurent Mesuré <laurent(dot)mesure(at)free(dot)fr>
To: pgsql-fr-generale <pgsql-fr-generale(at)postgresql(dot)org>
Subject: Re: determiner les champ de clef primaire d'une
Date: 2006-06-05 17:06:30
Message-ID: 44846496.6000208@free.fr
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

Stéphane BUNEL a écrit :

> Laurent Mesuré a écrit :
>
>> Bonjur,
>
>
> Bonjour,
>
>> ayant une table je voudrais extraire la liste des champs de la clef
>> primaire.
>>
>> j'"essaye avec les tables pg_class,pg_index, mais du coup je me
>> trouve confronté au type int2vector. Du coup, je suis sur qu'il y a
>> surement une methode plus simple, mais je ne la trouve pas.
>>
>>
>> Si quelqu'un a une idée
>
>
> Quelle version de PG utilisez-vous ?
>
> Quel est votre contexte ? Pour un besoin _ponctuel_, psql vous
> renseignera par la commande \d <nom_table>. De là un grep peux suffire
> à isoler les informations recherchés.
>
> ex:
>
> safari=# \d library
> Table "public.library"
> Column | Type | Modifiers
> --------+------+-----------
> key | text | not null
> value | text |
> Indexes:
> "library_pkey" PRIMARY KEY, btree ("key")
>
>
>
>
Non j'en ai besoin de facon recurrente. Dans une application j'ai besoin
d'extraire les champs de clef primaire pour la construction d'objet (en
php en fait). Du coup, il me faut bien passer par un SELECT.

postgresql 8.1 pour la version

laurent


From: "Daniel Verite" <daniel(at)manitou-mail(dot)org>
To: "Laurent =?ISO-8859-15?Q?Mesur=E9?=" <laurent(dot)mesure(at)free(dot)fr>
Cc: "pgsql-fr-generale" <pgsql-fr-generale(at)postgresql(dot)org>
Subject: Re: determiner les champ de clef primaire d'une
Date: 2006-06-05 17:44:53
Message-ID: 20060605194500.20524
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

Laurent Mesuré wrote:

> >> ayant une table je voudrais extraire la liste des champs de la clef
> >> primaire.
> >>
> >> j'"essaye avec les tables pg_class,pg_index, mais du coup je me
> >> trouve confronté au type int2vector. Du coup, je suis sur qu'il y a
> >> surement une methode plus simple, mais je ne la trouve pas.

Pour le nombre des champs, c'est pg_index.indnatts
Pour aller chercher les champs un par un, il y a une fonction
pg_catalog.pg_get_indexdef qui prend en argument le numéro de colonne
en commençant par 1, et qui renvoie le nom du champ, en gros.
Voir http://docs.postgresqlfr.org/8.1/functions-info.html

Et sinon dans psql, il est possible de faire
\set ECHO_HIDDEN pour voir les requêtes construites par psql pour
répondre aux commandes du type \d
C'est très utile pour apprendre des choses sur tout ce qui est
relatif au catalogue des données.

--
Daniel
PostgreSQL-powered mail user agent and storage: http://www.manitou-mail.org


From: Stéphane BUNEL <stephane(at)stratum-ip(dot)net>
To: Laurent Mesuré <laurent(dot)mesure(at)free(dot)fr>
Cc: pgsql-fr-generale <pgsql-fr-generale(at)postgresql(dot)org>
Subject: Re: determiner les champ de clef primaire d'une
Date: 2006-06-07 16:56:11
Message-ID: 4487052B.406@stratum-ip.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

Laurent Mesuré a écrit :
> Stéphane BUNEL a écrit :
>
>> Laurent Mesuré a écrit :
>>
>>> Bonjur,
>>
>>
>> Bonjour,
>>
>>> ayant une table je voudrais extraire la liste des champs de la clef
>>> primaire.
>>>
>>> j'"essaye avec les tables pg_class,pg_index, mais du coup je me
>>> trouve confronté au type int2vector. Du coup, je suis sur qu'il y a
>>> surement une methode plus simple, mais je ne la trouve pas.
>>>
>>>
>>> Si quelqu'un a une idée
>>
>>
>> Quelle version de PG utilisez-vous ?
>>
>> Quel est votre contexte ? Pour un besoin _ponctuel_, psql vous
>> renseignera par la commande \d <nom_table>. De là un grep peux suffire
>> à isoler les informations recherchés.
>>
>> ex:
>>
>> safari=# \d library
>> Table "public.library"
>> Column | Type | Modifiers
>> --------+------+-----------
>> key | text | not null
>> value | text |
>> Indexes:
>> "library_pkey" PRIMARY KEY, btree ("key")
>>
>>
>>
>>
> Non j'en ai besoin de facon recurrente. Dans une application j'ai besoin
> d'extraire les champs de clef primaire pour la construction d'objet (en
> php en fait). Du coup, il me faut bien passer par un SELECT.
>
> postgresql 8.1 pour la version

Pour inspiration j'ai testé avec un PG8.0 cette requête :

SELECT
ns.nspname as "le schema", cl.relname as "a la table", co.conname as
"avec une cle primaire", at.attname as "colonne"
FROM
pg_constraint co
JOIN pg_class cl
ON cl.oid = co.conrelid AND co.contype = 'p'
JOIN pg_namespace ns
ON ns.oid = co.connamespace
JOIN pg_attribute at
ON at.attrelid = co.conrelid AND at.attnum = ANY( co.conkey )

Qui donne une ligne pour chaque colonne appartenant à la clé primaire
d'une table : le schema | a la table | avec une
cle primaire | colonne
------------------+-------------------------+------------------------------+-------------------
public | person_title | person_title_pkey
| person_title_id
public | contract_type | contract_type_pkey
| contract_type_id
public | department | department_pkey
| department_id
(...)
service_mail | forward | forward_pkey
| ref_box_id
service_mail | forward | forward_pkey
| address
service_mail | domain | domain_pkey
| domain_id

Stéphane.