picture picture
janvier 13, 2018 MySQL 0 Commentaire

Une requête MySQL pour tester les clés étrangères

Comment extraire les lignes d’un table MYSQL dont les clés étrangères correspond à une ligne vide dans une autre table ? Autrement dit, comment tester si les clés étrangères correspondent  (ou non) à des clés primaires inexistantes (ou effacées) dans une autre table jointe ?

A priori une requête conditionnelle utilisant la commande « NOT IN » semblait tentante, mais à l’usage elle est extrêmement lente.

J’ai donc testé la commande « NOT EXISTS » qui est nettement plus performante. Il existe surement d’autres approches, mais je vous partage ici ce petit bout de code qui peut dépanner l’un ou l’autre (j’ai mis un peu de temps à trouver…)

L’objectif était d’extraire des stagiaires d’une table (des stagiaires :mrgreen: ) de plusieurs dizaines de milliers de lignes, en ne sélectionnant que ceux dont les stages avaient été effacés dans une autre table (des stages :mrgreen: )

La structure des tables peut se résumer de façon ultra simpliste à ceci :

TABLE "STAGIAIRE"
id_stagiaire    |  nom    |  id_stage
============================================
  1            |  Paul    |  2
  2            |  Pierre  |  1
  3            |  Jean    |  3
  4            |  Joël    |  17
============================================
									

TABLE "STAGE"
id_stage  |  nom    
=======================
  1      |  Théâtre
  2      |  Tennis
=======================
									

Pour extraire les stagiaires rattachés à un stage qui n’existe pas, une méthode rapide est la suivante :

SELECT nom
FROM stagiaire
WHERE NOT EXISTS (SELECT null FROM stage WHERE stage.id_stage=stagiaire.id_stage);
									

Pour l’exemple ci-dessus, le résultat de cette requête sera le suivant :  Jean et Joël (dont les clés étrangères id_stage ne correspondent à aucune clé primaire dans la table des stages)

That’s all folk !

No Responses to “Une requête MySQL pour tester les clés étrangères”

Commentaire

Name

Mail (ne sera pas publié)

Website

Laisser ces deux champs tels quels :
:D :-) :( :o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: