Bonjour à tous
Aujourd'hui dans mon appli j'ai eu besoin de lister toutes les tables (avec leur colonnes) liées par une contrainte d'intégrité à une table X.Y. C'était afin que mon appli autorise ou pas l'effacement de la ligne en cours sur la table X.Y (si cette ligne est nécessaire en tant que clef étrangère alors mon appli grise le bouton d'effacement).
J'ai réussi ma requête mais je l'ai fait de 2 façons différentes et j'aimerais avoir vos avis sur la meilleure des deux
Requête 1: je pars de pg_constraint et je descends sur pg_stat_user_tables et pg_attribute du coté "conrelid" et "confrelid"
Requête 2: je pars de pg_stat_user_tables et je descends sur pg_attribute puis pg_constraint puis pg_attribute puis pg_stat_user_tables
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 select tbl2.schemaname, tbl2.relname, col2.attname from pg_constraint inner join (pg_stat_user_tables as tbl1 inner join pg_attribute as col1 on (col1.attrelid = tbl1.relid) ) on (tbl1.relid=pg_constraint.confrelid) inner join (pg_stat_user_tables as tbl2 inner join pg_attribute as col2 on (col2.attrelid = tbl2.relid) ) on (tbl2.relid=pg_constraint.conrelid) where (tbl1.schemaname, tbl1.relname, col1.attname, pg_constraint.contype, col2.attnum)=('X', 'Y', 'colonne_concernée', 'f', pg_constraint.conkey[1]);
J'ai tenté un explain sur les deux requêtes mais le résultat est le même. J'aurais pourtant pensé qu'en partant de stat_user_tables (qui est la plus petite de toutes) les jointures générées seraient moins volumineuses donc que ce serait plus optimal mais visiblement je me suis fourvoyé...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 select tbl2.schemaname, tbl2.relname, col2.attname from pg_stat_user_tables as tbl1 inner join (pg_attribute as col1 inner join (pg_constraint inner join (pg_attribute as col2 inner join pg_stat_user_tables as tbl2 on (tbl2.relid=col2.attrelid) ) on (col2.attrelid=pg_constraint.conrelid) ) on (pg_constraint.confrelid=col1.attrelid) ) on (col1.attrelid=tbl1.relid) where (tbl1.schemaname, tbl1.relname, col1.attname, pg_constraint.contype, col2.attnum)=('X', 'Y', 'colonne_concernée', 'f', pg_constraint.conkey[1]);
Merci de vos retours...
Partager