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 :

Supprimer ligne si pas dans autre table


Sujet :

Requêtes MySQL

  1. #1
    Membre actif
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Points : 281
    Points
    281
    Par défaut Supprimer ligne si pas dans autre table
    Bonjour,
    alors je sait, cette question, est classique.
    Moi je faisais toujours :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM matable WHERE `champs` NOT IN (SELECT id FROM autre_table)
    très bien, sauf que ce coup-ci, la table correspondant à 'autre_table` est gigantesque, ce qui provoque un timeout ...

    J'ai essayer avec un LIMIT dans la sous requête, mais MySQL n'accepte pas les LIMIT dans les sous-requête de type IN ...

    Alors comment pourrais-je faire svp ?
    Merci d'avance.

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Essaie avec une jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DELETE a
    FROM matable a 
    LEFT OUTER JOIN autre_table b ON b.id = a.une_colonne -- et pas champ !
    WHERE b.id IS NULL
    Et pour accélérer les choses, indexer a.une_colonne. Vu son nom, je suppose que b.id est clé primaire, donc indexée.

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Bonjour,

    Avant de poser une question, merci de consulter la : http://mysql.developpez.com/faq/?pag..._data_sans_ref

  4. #4
    Membre actif
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Points : 281
    Points
    281
    Par défaut
    désolé, j'ai oublié de dire que j'avais aussi essayé, désolé

    Je montre quand même code et erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT COUNT(m1.id)
    FROM memory_card m1
    LEFT JOIN memory_j_mod_card m2 ON m1.id = m2.card
    WHERE m2.card IS NULL
    erreur :

    #1317 - Query execution was interrupted

    ça arrive au bout de 7 sec. environ ...
    merci.

    EDIT

    oups, désolé pour le code, j'ai fait un SELECT COUNT() au lieu d'un DELETE juste pour m'assurer que je n'en supprime pas trop, mais ça fait pareil avec un DELETE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DELETE m1
    FROM memory_card m1
    LEFT JOIN memory_j_mod_card m2 ON m1.id = m2.card
    WHERE m2.card IS NULL
    (donne le même résultat).

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,


    Avez-vous un index sur memory_j_mod_card.card et un autre sur memory_card.id ?

    Ensuite, quand vous aurez ces 2 indexes retestez votre requête actuelle et une en passant par un not exists (je ne sais pas si MySql interprete les 2 requetes de la même facon):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT COUNT(m1.id)
    FROM memory_card m1
    where not exists (select 1 from memory_j_mod_card m2 where m1.id = m2.card)
    Pis 7 sec de timeout c'est pas beaucoup ...

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Combien de lignes dans les tables ?

  7. #7
    Membre actif
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Points : 281
    Points
    281
    Par défaut
    Désolé, la table memory_j_mod_card a un primary key sur les colonnes 'card' et 'mod' ensemble (ce sont les seules colonnes), et la table memory_card a bien une colonne ID en primary key.


    Avez-vous un index sur memory_j_mod_card.card
    Je ne peu pas mettre un index sur la colonne card, mais il y en a un sur les champs 'card' et 'mod'.

    Et désolé, ça ne marche toujours pas.
    Au passage l'erreur survient après environ 9 à 15 sec. (variable apparemment).

    Pour le nombre de ligne :

    memory_card -> 78 000
    memory_j_mod_card -> 90 000

    et ce n'est rien par rapport à ce qu'il y aura plus tard
    D'ailleurs, c'est pas encore énorme ...

    merci.

Discussions similaires

  1. Afficher les lignes se trouvant pas dans une table
    Par Invité dans le forum Requêtes
    Réponses: 6
    Dernier message: 11/11/2011, 19h46
  2. Ajouter une ligne si elle n'existe pas dans la table
    Par daimadoshi dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 19/11/2010, 15h52
  3. Réponses: 3
    Dernier message: 12/10/2009, 12h51
  4. language SQL - Copier une ligne dans autre table
    Par fxd dans le forum Langage SQL
    Réponses: 1
    Dernier message: 26/10/2005, 18h16
  5. supprimer un enregistrement vide dans une table oracle
    Par shurized dans le forum Bases de données
    Réponses: 11
    Dernier message: 07/09/2004, 16h55

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