PostgreSQL
La base de données la plus sophistiquée au monde.

Ouverture de session

Navigation

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

Contraintes de clé primaire

Technique - général | Contraintes de clé primaire

Par deY le 25/04/2007 - 19:41

Bonjour,

je souhaiterais recupĂ©rer la liste des champs d'une table, j'y arrive en partie Ă  l'aide de la requĂȘte suivante :

SELECT pa.attname, pt.typname, pa.attnotnull
FROM pg_attribute pa
LEFT JOIN pg_type pt ON pt.oid = pa.atttypid
LEFT JOIN pg_class pc ON pc.oid = pa.attrelid
WHERE pc.relname = 'branches'
AND pa.attnum > 0

Mais je souhaiterais rajouter la verification de clé primaire, pour connaitre le ou les champs qui constituent la contrainte de clé primaire.
je me suis orienté vers pg_constraint, mais je ne trouve pas le moyen de faire une joiture avec pg_attribute, puisque attnum est de type smallint et conkey de type smallint[]

Merci d'avance.

Options d'affichage des commentaires

Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder les paramÚtres" pour activer vos changements.

RE : Contraintes de clé primaire

paulmackay/ = 26 Avril, 2007 - 14:47

Salut,

En effet il faut utiliser pg_constraint et le champ conkey. Celui-ci est un array contenant le ou les attnum(s) faisant partie de la clĂ© primaire. Ainsi, il faut adapter ta requĂȘte comme ceci :

SELECT pa.attname, pt.typname, pa.attnotnull, CASE WHEN pa.attnum = ANY (pct.conkey) THEN 'Oui' ELSE 'Non' END as PK
FROM pg_attribute pa
LEFT JOIN pg_type pt ON pt.oid = pa.atttypid
LEFT JOIN pg_class pc ON pc.oid = pa.attrelid
LEFT JOIN pg_constraint pct ON pct.conrelid = pc.oid
WHERE pc.relname = 'branches'
AND pa.attnum > 0
AND pct.contype = 'p' ;

On filtre sur pct.contype pour n'avoir que la contrainte de clé primaire. La 4e colonne vaut "Oui" si l'attribut fait partie de la clé primaire et "Non" sinon ...

@+,
Paul


merci beaucoup de ton aide, m

deY/ = 26 Avril, 2007 - 15:25

merci beaucoup de ton aide, mais entre temps j'ai pondu ça :

SELECT c.column_name, c.data_type, c.is_nullable, CAST('t' AS boolean) AS is_pk
FROM information_schema.columns c
LEFT JOIN information_schema.constraint_column_usage cc ON cc.column_name = c.column_name
WHERE c.table_name = 'services'
AND cc.constraint_name = 'pk_'||c.table_name
UNION
SELECT c.column_name, c.data_type, c.is_nullable, CAST('f' AS boolean) AS is_pk
FROM information_schema.columns c
WHERE c.table_name = 'services'
AND c.column_name NOT IN (SELECT c.column_name
FROM information_schema.constraint_column_usage c
WHERE c.table_name = 'services'
AND c.constraint_name = 'pk_'||c.table_name)

Je vais voir si ta solution est plus simple.
Parceque j'ai besoin de l'ensemble des champs, et pas que de la PK.

:)


© PostgreSQLFr, tous droits rĂ©servĂ©s.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.