IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

utilisation d'une clé étrangère


Sujet :

Requêtes MySQL

  1. #1
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut utilisation d'une clé étrangère
    Bonjour

    Voici des avantages aux contraintes de clés étrangères :

    *

    En supposant que les relations soient proprement con¸ues, les clés étrangères rendent plus difficile pour un programmeur d'insérer des valeurs incohérentes dans la base.
    *

    La vérification centralisée de contraintes par le serveur de base de données rend inutiles l'application de ces vérifications du coté de l'application. Cela élimine la possibilité que d'autres applications ne fassent pas les vérifications de la même fa¸on que les autres.
    *

    L'utilisation des modifications et effacement en cascade simplifie le code du client.
    *

    Les règles de clés étrangères proprement con¸ues aident à la documentation des relations entre les tables.

    J'ai 4 tables innoDB dans une même base de données.

    La table principale à un nombre incrémenté automatiquement comme clé et un champ 'accession'.

    Mes trois autres tables contiennent des informations complémentaires pour certaines entrées de la table principale et on pour clé primaire l'accession.

    Je vais devoir faire des requêtes de jointure pour récupérer des informations croisées. Est-ce utile dans mon cas d'utiliser une clé étrangère? Quand j'essaie de mettre un index sur le champ 'accession' de ma table principale, j'obtiens un message d'erreur me disant que le type BLOB nécessite une valeur numérique.


    Merci pour votre aide,

  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    salut,

    pourquoi tu n'utilises pas comme clé ta valeur numérique sur tes autres tables?
    ca serait beaucoup moins lourd

    Pour en revenir sur l'index sur le champ blob, un peu de lecture : http://dev.mysql.com/doc/refman/5.0/...ate-index.html

  3. #3
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Merci beaucoup pour ton aide. Je viens de rajouter l'id comme clé primaire. Maintenant que mes 4 tables ont la même clé primaire que dois-je faire? Est-il possible de créer un lien entre 2 clé primaires?

  4. #4
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    J'ai 4 tables innoDB dans une même base de données.

    La table principale à un nombre incrémenté automatiquement comme clé et un champ 'accession'.

    Mes trois autres tables contiennent des informations complémentaires pour certaines entrées de la table principale et on pour clé primaire l'accession.
    Saluton, Jasmine,
    Une chose me chiffonne dans tout ça, quel type de relations y-a-t'il entre la table mère et ses fillles.
    Sont-ce des relation 1-n ou 1-1, je veux dire est-ce qu'à tout élément mère il peut correspondre au plus une fille dans chacune des tables ou n filles dans chacune des tables (il peut aussi n'y avoir aucune fille dans aucune des tables ou certaines d'entre elles).
    C'est important pour gérer l'export de la clé mère (FK pour les filles) car si une mère peut avoir plusieurs filles dans une même table fille, il ne faut pas que la FK soit PK dans la table fille.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  5. #5
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    C'est une relation 1-1 entre la mère et les filles et les trois filles n'ont aucune entrée commune. J'ai bien compris que la relation mère fille ne pourrait pas être 1-n car j'aurais une duplication de ma clé primaire ce qui aurait d'ailleurs généré plein de messages d'erreur au remplissage des filles.

    La question reste donc à quoi bon faire 4 tables ... c'est plus léger à gérer. J'ai des dizaines de milliers (si pas des centaines) d'entrées chez la mère et 202, 153, 19 entrées chez les filles. De plus je n'aurai pas souvent besoin des données complémentaires de la mère (sauf peut-être un champ que je pourrai importer de la mère vers les filles). J'avais hésité à récupérer tous les champs de la mère absents de chez les filles mais ça aurait crée de la redondance qui me semble inutile. Contredis moi si je me trompe mais il est préférable d'utiliser des jointures entre mes tables que de dupliquer mes champs entre la mère et ses filles.



    Merci pour votre aide.

  6. #6
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    C'est une relation 1-1 entre la mère et les filles et les trois filles n'ont aucune entrée commune.
    Veux-tu dire qu'une mère ne peux avoir au plus qu'une fille (donc éventuellement 0 fille) ?
    Citation Envoyé par Jasmine80 Voir le message
    La question reste donc à quoi bon faire 4 tables ... c'est plus léger à gérer. J'ai des dizaines de milliers (si pas des centaines) d'entrées chez la mère et 202, 153, 19 entrées chez les filles.
    Mais quelles différences de structures y-a-t'il vraiment entre ces types de filles ?
    Citation Envoyé par Jasmine80 Voir le message
    Contredis moi si je me trompe mais il est préférable d'utiliser des jointures entre mes tables que de dupliquer mes champs entre la mère et ses filles.
    Ça, bien sûr.
    Mais je n'ai qu'une vision très incomplète de ton domaine de gestion.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  7. #7
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    Veux-tu dire qu'une mère ne peux avoir au plus qu'une fille (donc éventuellement 0 fille) ? Mais quelles différences de structures y-a-t'il vraiment entre ces types de filles ?Ça, bien sûr.
    Mais je n'ai qu'une vision très incomplète de ton domaine de gestion.
    Oui exactement, une entrée mère possède au plus une entrée fille dans une des trois tables filles.

    Les trois filles ont exactement la même structure, la différence est l'origine biologique de leur contenu. Si je veux ne créer qu'une seule table fille, je dois rajouter un champ contenant cette origine (le nom des tables filles en fait). Pour mes jointures ultérieures peut-être cela serait-il plus simple de ne créer qu'une seule fille et d'ajouter un champ quoique qu'à priori je ne dois traiter ces filles qu'une seule à la fois, elles sont indépendantes.

  8. #8
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Ouais, je pense aussi que tu ferais mieux de n'avoir qu'une seule table fille en typant les lignes.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  9. #9
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Une fois de plus, merci pour ton aide.
    Je suppose que regrouper mes filles en ajoutant un champ peut se faire facilement en SQL sans devoir recréer ma table fille via mon programme. Note que, le modifier un peu et le refaire tourner serait très rapide, mais autant apprendre à bien utiliser l'SQL.
    Je pense à quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update new_table_fille set * = (select ch1, ch2, ch3 fom fille1) + valeur nouveau_champ + (select ch4, ch5, ch6 fom fille1)
    Est-ce possible en une seule requête (par fille) d'ajouter un champ au milieu des précédents? Je suppose que oui si j'utilise 2 select de part et d'autre.

  10. #10
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Je pense à quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update new_table_fille set * = (select ch1, ch2, ch3 fom fille1) + valeur nouveau_champ + (select ch4, ch5, ch6 fom fille1)
    Comme cela ? sûrement pas.
    Tu dois tout d'abord modifier l'une des trois tables filles pour lui ajouter (ALTER TABLE) une colonne type_de_fille qui pourrait être un ENUM des trois types de filles, NOT NULL, et qui prendrait, par DEFAULT le type de fille de cette table, laquelle tu renommeras à ta guise avec un autre ALTER TABLE.

    Ensuite, dans une deuxième requête, tu feras des INSERT INTO cette table modifiée, à partir de deux SELECT sur les deux autres tables filles dans lesquels tu ajouteras, pour chacun des SELECT une colonne représentant le type de fille et tu mettras ces deux SELECTs en UNION.
    Je ne doute pas que tu parviennes à écrire ces requêtes toute seule, et puis c'est plus formateur que de te les fournir toutes faites.
    En tout état de cause, fais une sauvegarde des trois tables avant toute chose, au cas où.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  11. #11
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    une colonne type_de_fille qui pourrait être un ENUM des trois types de filles, NOT NULL, et qui prendrait, par DEFAULT le type de fille de cette table, laquelle tu renommeras à ta guise avec un autre ALTER TABLE.
    Je peux donc dire que le défaut est une valeur de 3 autres tables?


    Citation Envoyé par Maljuna Kris Voir le message
    tu ajouteras, pour chacun des SELECT une colonne représentant le type de fille
    Afin de rajouter une colonne dans le select, dois-je d'abord ajouter un champ à mes tables?
    J'ai dû mal à comprendre tes directives, ce qui n'est pas étonnant vu mon niveau en SQL.

    Citation Envoyé par Maljuna Kris Voir le message
    Je ne doute pas que tu parviennes à écrire ces requêtes toute seule, et puis c'est plus formateur que de te les fournir toutes faites.
    Oui, tout à fait, si tu me les fournis, je ferai un simple copier-coller qui sera vite oublié.

    Citation Envoyé par Maljuna Kris Voir le message
    En tout état de cause, fais une sauvegarde des trois tables avant toute chose, au cas où.
    Oui, c'est la première chose que j'ai faite après leur création ... quoique c'est un peu de la paranoia vu que le programme qui les a crées et remplies est toujours réutilisable.


    Ce qui me vient plutôt à l'esprit serait
    1) renommer ma table fille1 en fille (qui contiendra toutes les valeurs filles)
    2) ajouter un champ type_fille et de laisser le champ type_fille vide par défaut
    3) faire un ALTER TABLE SET type_fille = 'valeur fille1'
    4) INSERT INTO fille SELECT valeurs fille2
    5) faire un ALTER TABLE SET type_fille = 'valeur fille2' WHERE type_fille IS NULL
    4) INSERT INTO fille SELECT valeurs fille3
    5) faire un ALTER TABLE SET type_fille = 'valeur fille3' WHERE type_fille IS NULL

    Mais donc si j'ai bien compris ton idée se serait plutôt
    1) renommer ma table fille1 en fille (qui contiendra toutes les valeurs filles)
    2) ajouter un champ type_fille ENUM des trois types de filles, NOT NULL, et qui prendrait, par DEFAULT le type de fille de cette table
    3) INSERT INTO fille à partir de deux SELECT sur les deux autres tables filles dans lesquels tu ajouteras, pour chacun des SELECT une colonne représentant le type de fille et tu mettras ces deux SELECTs en UNION.

    Ta façon de faire se fait-elle donc en 3 requêtes?
    Je vais essayer de voir dans le manuel MySQL comment réaliser ton point 2 et 3.


    Merci pour ces directives.


    PS : Vu que toutes les données de mes tables filles sont dans trois fichiers textes, il me suffirait de créer un fichier unique formaté afin de contenir toutes les information de t_fille ... mais ça serait la facilité, je garde cela comme solution de secours quand il ne me restera plus aucun cheveu à m'arracher sur la tête à cause d'SQL.

  12. #12
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    a. Nom général aux 3 filles : RENAME TABLE a_alternata TO consensus
    b. Suppression du champ accession : ALTER TABLE consensus DROP COLUMN accession
    c. Ajout du champ type : ALTER TABLE consensus ADD type ENUM ('Aspergillus fumigatus', 'Alternaria alternata', 'Davidiella tassiana') AFTER id
    d. Mise à jour du nouveau champ type : UPDATE consensus SET type = 'Alternaria alternata'
    e. Ajout des données de a_fumigatus et de d_ tassiana : INSERT INTO consensus (id, type, organism, score, blast_length, cover) VALUES (SELECT id, 'Aspergillus fumigatus', organism, score, blast_length, cover FOM a_fumigatus) UNION (SELECT id, ' Davidiella tassiana', organism, score, blast_length, cover FOM d_ tassiana)
    J'ai un problème avec la dernière requête. Le champ type est mis en majuscules mais vu qu'il a été crée je suppose que ce nom ne pose pas de problème... l'erreur vient des select, on dirait qu'il n'accepte pas les noms de table sans guillemet, pourtant ça n'a posé aucun problème pour les requêtes précédentes.

    Merci,

  13. #13
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    salut Jasmine,

    pas de 'values' quand tu insères à partir d'un select :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO consensus (id, type, organism, score, blast_length, cover) 
    SELECT id, 'Aspergillus fumigatus', organism, score, blast_length, cover FROM a_fumigatus 
    UNION 
    SELECT id, ' Davidiella tassiana', organism, score, blast_length, cover FROM d_ tassiana

  14. #14
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Merci ... je remarque également que j'ai mis un espace devant ' Davidiella tassiana' et au milieu de mon nom de table d_ tassiana.

    Merci beaucoup pour ton aide, tout fonctionne maintenant.

  15. #15
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Quand tu as un doute sur le fait qu'un nom de table ou de colonne ne soit un mot réservé MySQL, tu l'encapsules avec des ALT GR + 7 `nom_douteux`.
    Le mieux étant, évidemment, d'éviter d'utiliser des mots réservés en tant que nom de tables, colonnes, index, FK etc...
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  16. #16
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    Quand tu as un doute sur le fait qu'un nom de table ou de colonne ne soit un mot réservé MySQL, tu l'encapsules avec des ALT GR + 7 `nom_douteux`.
    Le mieux étant, évidemment, d'éviter d'utiliser des mots réservés en tant que nom de tables, colonnes, index, FK etc...
    Je ne savais pas que le nom 'type' poserait problème mais à vrai dire ça n'a pas d'importance, je vais renommer mon champ 'linking_consensus' ça sera bien plus parlant que 'type'.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Foreign Key] Un champ est-il une clé étrangère ?
    Par starch dans le forum Bases de données
    Réponses: 5
    Dernier message: 27/02/2004, 13h01
  2. utilisation d'une variable globale
    Par ZZ dans le forum ASP
    Réponses: 3
    Dernier message: 03/12/2003, 19h11
  3. Utilisation d'une variable sur plusieurs unités
    Par Yamaneko dans le forum Langage
    Réponses: 2
    Dernier message: 05/06/2003, 11h23
  4. Utilisation d'une dll écrite en delphi 5 dans VB6
    Par Jean-Louis dans le forum Langage
    Réponses: 4
    Dernier message: 05/08/2002, 09h19
  5. Réponses: 4
    Dernier message: 05/06/2002, 14h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo