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 :

Suppression avec contrôle de lien inter-tables [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éprouvé Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Par défaut Suppression avec contrôle de lien inter-tables
    Bonsoir,

    j'utilise MySql et je voudrai savoir s'il existe une fonction pour faire ceci :

    J'ai une table de référence que j'appel pays dans laquelle j'ai un id_pays et un libelle_pays

    J'ai une table client dans laquelle je fais référence à id_pays pour connaître le libellé du pays du client.

    Tout cela est très simple

    Maintenant, je veux supprimer dans ma table de référence un pays, mais je dois contrôler que ce pays n'est pas utiliser dans d'autres tables. Si le pays est utilisé dans d'autres table, j'interdis la suppression.

    Espérant avoir été clair

  2. #2
    Membre émérite
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Par défaut
    Salut,

    Oui tu as été clair, c'est un principe connu en base de données : les clés étrangères.

    Lis cette page de la doc MySQL qui te sera très utile : http://dev.mysql.com/doc/refman/5.1/...nstraints.html. (ou regarde juste les exemples, tu trouveras très vite comment utiliser les clés étrangères)

    Attention à bien utiliser le moteur InnoDB pour tes deux tables.

  3. #3
    Membre émérite Avatar de alain31tl
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 935
    Par défaut
    Salut

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $sql = "SELECT count(id_pays) FROM table_client WHERE id_pays='$id_pays";
    $val= mysql_fetch_array(mysql_query($sql));
    $nbre = $val[0];
     
    if($nbre<1)
    {
    $query=mysql_query("DELETE FROM table_pays WHERE id_pays='$id_pays'");}
    else
    {
    // Pas d'action
    }

  4. #4
    Membre éprouvé Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Par défaut
    Les clés étrangère oui c'est cela même.

    Bon un peu de lecture pour vous faire un avis.

    Merci BIGLO mais je préfère la version en français ici

    J'ai lu cela aussi.
    Bref bien regarder si on en a vraiment besoin des clés étrangères, sinon, il y a la solution de alain31tl (merci) à mettre en fonction pour ne jamais l'oublié. et créer les fonctions à chaque fois qu'une table est en relation de dépendance avec une autre.

    Merci à tous.

  5. #5
    Membre émérite
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Par défaut
    Citation Envoyé par pierre3
    Merci BIGLO mais je préfère la version en français
    Même si tu es plus à l'aise avec la doc française de MySQL, je te conseille de toujours jeter un oeil à la version anglaise : ce n'est pas rare d'y trouver des détails très importants et surtout des exemples supplémentaires.

    La solution "programmeur" proposée par alain31tl fonctionne bien sûr et permet notamment de garder MyISAM. Mais plus la table client va se remplir, plus le COUNT(*) va prendre du temps. Alors qu'avec les FOREIGN KEY, InnoDB interdit la suppression dès qu'il trouve 1 client avec ce pays.

  6. #6
    Membre éprouvé Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Par défaut Merci BIGLO
    Mais ce que j'ai lu sur les performances des Foreign Key ne m'incite pas vraiment à franchir le pas.

    C'est vrai que j'ai des tables qui font 80 000 enregistrements.

    Bon, il va falloir que je me penche prochainement plus en détail en faisant des tests sur plusieurs tables.

    Si c'est concluant, il faudra que je passe toutes mes tables en innodb (près de 100) ou seulement celles qui sont concernés par les Foreign Key.

  7. #7
    Membre émérite
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Par défaut
    Oui, réalise des tests, c'est le meilleur moyen de se faire une vraie idée. Et au moins ça sera adapté aux données de ta base.

    Si tu n'as pas besoin des autres avantages d'InnoDB, c'est vrai qu'il vaut mieux réfléchir à deux fois. En plus, je suppose que la tentative de suppression d'un pays sera plutôt rare, et que les pays ne changeront pas d'ID. Alors si tu n'as besoin que des FK pour ça, c'est un peu dommage de ralentir les SELECT et les autres requêtes fréquentes en choisissant InnoDB.

  8. #8
    Membre éprouvé Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Par défaut
    Oui, vu l'organisation de ma base c'est vraiment que pour la suppression des tables de libellé (ce qui est rare).

    Pour le reste, la suppression n'existe pas, c'est de l'archivage par marquage spécial.

    Mais j'irai voir les autres atouts de innoDB, on ne sait jamais.

    Merci encore.

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

Discussions similaires

  1. [Web Service][avec Struts]un tuto? un lien?
    Par javazer dans le forum Struts 1
    Réponses: 3
    Dernier message: 28/03/2006, 18h32
  2. transformation d'un lien inter-page en XSL
    Par nice dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 05/02/2006, 13h38
  3. Suppression avec sous-requête conditionnelle
    Par Magnus dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/10/2005, 10h39
  4. Requete de suppression avec en condition une date
    Par PrinceMaster77 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 29/04/2004, 09h23
  5. suppression avec sous requête conditionnelle
    Par melmel dans le forum Requêtes
    Réponses: 8
    Dernier message: 18/03/2004, 23h20

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