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

PHP & Base de données Discussion :

Trouver clé secondaire qui n'ont pas de clé primaire [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 3
    Par défaut Trouver clé secondaire qui n'ont pas de clé primaire
    Bonsoir. Je développe un JDR en PHP, dans le but de m'entrainer au PHP mais je suis confronté à un problème. Par soucis de temps, il m'arrive de supprimer des entrées directement via PHPMyAdmin. Le seul problème, c'est que si je supprime le joueur n°24 par exemple, les entrées dans la table inventaire, ainsi que dans beaucoup d'autres tables seront toujours présentes.

    Je me demandais donc, si il y avait une fonction permettant de trouver toutes les entrées d'une table, qui ont une valeur qui n'est pas pas dans une autre table.

    Par exemple dans la table joueur :

    1
    2
    3

    Et dans la table inventaire :

    1
    3
    4
    5

    Je voudrais qu'il me retourne, l'entrée qui a la valeur 4 et celle qui a la valeur 5 de la table inventaire, mais pas celle qui à la valeur 2 de la table joueur (un joueur peut ne pas avoir d'objet dans l'inventaire, auquel cas il n'a aucune entrée).

    Est ce possible ? J'avais déjà tenté quelque chose comme ceci :
    DELETE FROM inventaire, joueur WHERE id_joueur` != 'joueur'.`id_joueur`
    Mais ça ne marche pas (et heureusement, car cela m'aurait supprimé des entrées dans les deux tables).

    J'ai peut-etre une idée, avec un for each, en prenant le n° de joueur de la table inventaire un par un, et en cherchant si il y a une correspondance dans la table joueur, et ça pour tous les numéros, mais cela va faire un script très long à charger.
    Si vous avez une autre idée, je suis preneur.


    Merci d'avance.

  2. #2
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Par soucis de temps, il m'arrive de supprimer des entrées directement via PHPMyAdmin. Le seul problème, c'est que si je supprime le joueur n°24 par exemple, les entrées dans la table inventaire, ainsi que dans beaucoup d'autres tables seront toujours présentes.
    Et bien au lieu de faire ces suppressions "à la mano" dans PhpMyAdmin, faudrait te créer une page, une interface qui va supprimer le joueur dans toutes les tables liées.
    Pour ça, suffit de repérer une bonne fois pour toutes les tables liées qui devront être supprimées.
    Une fois fait, plus de problème de données "orphelines". En plus, c'est plus rapide, (quelques click), et plus agréable (tout dépend de l'interface).


    Mais il est possible de récupérer ces données "orphelines" si le mal est déjà fait.
    La table "joueurs" contient les bonnes données.
    La table "inventaire" contient des données orphelines à supprimer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM inventaire WHERE id_joueur NOT IN (SELECT id_joueur FROM joueurs)
    On supprime tous les joueurs ne se trouvant pas dans la table "joueurs", et cela, d'un coup.

    /!\ Backup avant !!!

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 3
    Par défaut Merci
    Désolé pour le retard, je pensais que ça allait m'avertir des réponse par défaut, mais nion.

    Omfg ! La requète ultime ! \o/
    Et je viens de tester, c'est vraiment puissant. En plus ça tient en une ligne, donc j'peux la mettre dans mon include, includationné dans toutes mes pages.

    Par contre, une petite question :
    Pourquoi est ce que cette requète ne marche t-elle pas ?

    DELETE FROM inventaire, caracteristique WHERE id_joueur NOT IN (SELECT id_joueur FROM joueur)

    J'ai essayé de préciser la table pour chaque "id_joueur" mais cela ne marche pas. Après l'autre solution c'est de faire une requète par table.


    Et pour ta remarque du début, j'ai un pannel d'administration, mais il m'arrive de supprimer des joueurs via PhpMyAdmin, vu que c'est encore en développement, et que j'aime faire des farces à mes amis-testeurs

    En tout cas merci beaucoup ! Bonne soirée !

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 83
    Par défaut syntaxe de suppression multiple
    Bonsoir,

    Ta requete ne marche pas car la syntaxe de suppression multiple est spécifique chez MySQL http://dev.mysql.com/doc/refman/5.1/en/delete.html

    attention à la version !!!


    Pour ton problème à l'origine il faut changer de moteur, passer de MyIsam à InnoDB et ajouter des contraintes de clés étrangères pour déclencher automatiquement les suppresssions des lignes concernées.

    cf. : http://dev.mysql.com/doc/refman/5.1/...nstraints.html


    Xavier

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 3
    Par défaut
    J'ai trouvé une soltion. Je vais me faire une petite page perso dans mon pannel Admin, avec un bouton "Purger la BDD" et hop. Comme ça, ça évite de mettre les requètes dans mon include principal, et donc de surcharger les pages. (D'autant que le fait d'avoir des entrées obsolètes ne fait rien à part prendre de la place, vu que normalement, les auto-incrémentation ne reviennent pas au début toutes seules.).
    En tout cas merci beaucoup.

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

Discussions similaires

  1. [RegEx] Trouver les images qui n'ont pas de lien
    Par ll_RNDM_ll dans le forum Langage
    Réponses: 4
    Dernier message: 03/07/2014, 10h09
  2. Réponses: 3
    Dernier message: 27/05/2014, 19h10
  3. A ceux qui n'ont pas migré vers VB.NET
    Par bidou dans le forum VB 6 et antérieur
    Réponses: 153
    Dernier message: 12/12/2013, 13h33
  4. Réponses: 2
    Dernier message: 12/06/2008, 11h53
  5. la liste des clients qui n'ont pas acheter aucun article ...
    Par TéBeSsI dans le forum Langage SQL
    Réponses: 6
    Dernier message: 13/02/2004, 14h57

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