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 :

problème pour effacer des entrées dans 2 tables jointes


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 problème pour effacer des entrées dans 2 tables jointes
    Voici la structure de ma DB
    structure


    L'ennui est que pour un même id de fungi2, j'ai plusieurs entrées dans fungi2_accessions. Je voudrais supprimer les entrées de ces deux tables pour lesquelles fungi2.organism contient le mot 'uncultured'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT fungi2_accessions.*, fungi2.*
    FROM fungi2_accessions, fungi2
    WHERE fungi2_accessions.id = fungi2.id
    AND fungi2.organism like '%uncultured%'
    2359 entrées

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DELETE
    FROM fungi2_accessions, fungi2
    WHERE fungi2_accessions.id = fungi2.id
    AND fungi2.organism like '%uncultured%'
    Avec cette requête, je crains de ne récupérer qu'une seule des entrées de fungi2_accessions associées à fungi2 ... serait-ce le cas?

    Une jointure serait-elle mieux ... je n'arrive pas à voir le résultat de cette requête, je ne sais donc pas si le nombre d'entrées récupéré est supérieur ou non à la requête précédente.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM fungi2 f
    LEFT JOIN fungi2_accessions fa ON f.id = fa.id 
    WHERE f.organism LIKE '%uncultured%'

    Merci pour vos conseils,

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Si vos tables sont en InnoDB, la contrainte ON DELETE CASCADE fonctionne et comme fungi2_accessions.id est clé étrangère référençant fungi2.id, supprimer une ligne de fungi2 supprimera les lignes en correspondance dans fungi2_accessions.

    Sinon il faut d'abord supprimer les lignes dans fungi2_accessions puis dans fungi2. Autrement dit faire en deux requêtes ce que le SGBD est capable de faire tout seul avec une seule requête et une base correctement implémentée.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  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 pour votre aide.

    Citation Envoyé par CinePhil Voir le message
    Si vos tables sont en InnoDB, la contrainte ON DELETE CASCADE fonctionne et comme fungi2_accessions.id est clé étrangère référençant fungi2.id, supprimer une ligne de fungi2 supprimera les lignes en correspondance dans fungi2_accessions.
    Oui ce sont 2 table InooDB, je pense même que c'est obligatoire pour créer une FK, non? Je vais regarder ON DELETE CASCADE.

    Citation Envoyé par CinePhil Voir le message
    Sinon il faut d'abord supprimer les lignes dans fungi2_accessions puis dans fungi2. Autrement dit faire en deux requêtes ce que le SGBD est capable de faire tout seul avec une seule requête et une base correctement implémentée.
    Ma base est-elle incorrectement implémentée? N'hésitez pas à me dire comment l'améliorer. Merci.

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Puisque vos tables sont en InnoDB il n'y a pas de problème. Activez le ON DELETE CASCADE sur la clé étrangère et supprimez les lignes voulues de fungi2. Les lignes correspondantes dans fungi2_associations auront disparu elles aussi.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  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
    Merci pour ton aide.

    J'ai un autre problème, je ne suis pas certaine que la FK a bien été déclarée. Quand j'ai utilisé DBDesigner4, la FK est bien apparue sur le schéma par contre, je ne la retrouve pas dans la liste des index de la table dans PhpMyAdmin. Comment puis-je faire? Dois-je retourner dans DBD4 ou alors la créé avec une commande?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ALTER TABLE fungi2_accession
    ADD FOREIGN KEY [id] (id)
    REFERENCES fungi2 (id)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DELETE
    FROM fungi2
    WHERE fungi2.organism LIKE '%uncultured%'
    ON DELETE CASCADE fungi2_accession.id


    Merci.

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    ON DELETE CASCADE s'applique sur la déclaration de clé étrangère, donc dans le CREATE ou ALTER TABLE.

    Ensuite, tu DELETE dans la table mère (celle qui donne sa clé primaire à l'autre en tant que clé étrangère) et les lignes en correspondance par la clé étrangère dans la table fille seront supprimées automatiquement.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

Discussions similaires

  1. [XL-2003] Problème pour aligner des entrées multicolonnes dans une ListBox ?
    Par -Naek- dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/05/2009, 13h59
  2. Réponses: 2
    Dernier message: 17/10/2006, 11h25
  3. Problème pour rentrer des données dans MySQL
    Par Sandara dans le forum Requêtes
    Réponses: 8
    Dernier message: 06/06/2006, 10h59
  4. Problèmes pour sauver des caractères dans un input
    Par kalash_jako dans le forum Langage
    Réponses: 3
    Dernier message: 23/04/2006, 21h10
  5. Effacer des entrées dans deux tables
    Par stormz dans le forum Langage SQL
    Réponses: 1
    Dernier message: 17/01/2006, 12h28

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