PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 15/02/2022 12:53:08

Foreign Keys dans information_schema

Bonjour,

Dans du code PL, j'ai besoin d'aller parcourir des clés étrangère dans le information_schema.

Les colonnes "sources" de la clé peuvent être trouvées dans information_schema.key_column_usage où il y a bien un ordinal_position qui me dit dans quel ordre prendre les colonnes dans la définition de la clé.

Les colonnes "cibles" peuvent être trouvées dans information_schema.constraint_column_usage mais là je n'ai pas de "ordinal_position".

À quel endroit je peux trouver l'ordre des colonnes de la table vers laquelle pointe la FK ?

Hors ligne

#2 16/02/2022 10:02:40

rjuju
Administrateur

Re : Foreign Keys dans information_schema

Bonjour,

Vous avez l'information dans information_schema.key_column_usage.position_in_unique_constraint, mais il faut pour cela utiliser la contrainte unique utilisée par la clé étrangère.


Le catalogue postgres est peut être plus adapté pour ça, voir https://www.postgresql.org/docs/current … raint.html.

Hors ligne

#3 16/02/2022 12:45:21

Re : Foreign Keys dans information_schema

rjuju a écrit :

Bonjour,

Vous avez l'information dans information_schema.key_column_usage.position_in_unique_constraint, mais il faut pour cela utiliser la contrainte unique utilisée par la clé étrangère.


Le catalogue postgres est peut être plus adapté pour ça, voir https://www.postgresql.org/docs/current … raint.html.


Oui effectivement, je suis finalement  passé par pg_catalog et ça fonctionne ; mais j'ai toujours un peu la trouille que pg_catalog change lors d'un upgrade de version majeure...

Edit : Pour ceux qui rencontreraient ce genre de problème, ça fait du code qui ressemble à ça :

DECLARE
...
colcur_f CURSOR (cname text, carr INT[]) FOR 
        select column_name,ordinal_position from information_schema.columns t, unnest(carr) WITH ORDINALITY a(elem, nr) where t.ordinal_position = a.elem AND t.table_name = cname and t.table_schema = 'public' order by a.nr;
...
BEGIN
...

        -- On récupère le tableau des colonnes sources de la FK
        select c.confkey,c.conname INTO l_colarray,l_table_cible from pg_catalog.pg_constraint c , pg_catalog.pg_namespace n 
        where n.oid = c.connamespace  AND n.nspname='public' and conname=lfkcur.constraint_name;
        RAISE NOTICE 'Clefs trouvées % sur % ',l_colarray,l_table_cible;
...
        FOR lcolcur IN colcur_f(l_table_cible, l_colarray) LOOP

...

Dernière modification par herve.lefebvre (16/02/2022 16:30:47)

Hors ligne

Pied de page des forums