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 :

suppression à partir d'une table mysql Innod


Sujet :

Requêtes MySQL

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 78
    Par défaut suppression à partir d'une table mysql Innod
    salut,

    j'ai créé une tables "serveur" comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TABLE serveur (
     nom_machine varchar(20) NOT NULL,
     IP_privee varchar(20) ,
     IP_publique varchar(20),
     PRIMARY KEY (nom_machine)
     
    );
    Et une table "service":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TABLE service (
     Id_service int(11) NOT NULL auto_increment,
     nom_service varchar(20),
     num_port int(20) NOT NULL,
     path_log varchar(80),
     PRIMARY KEY (Id_service)
    );
    Et une table intermédiaire contenant les clé primaire de "serveur" et "service" comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TABLE serveur_service (
     Id_service int(11) NOT NULL auto_increment,
     nom_machine varchar(20) NOT NULL,
     PRIMARY KEY (Id_service,nom_machine),
     FOREIGN KEY(Id_service) REFERENCES service(Id_service) ON DELETE CASCADE,
     FOREIGN KEY(nom_machine) REFERENCES serveur(nom_machine) ON DELETE CASCADE
    );]

    les tables sont de type Myisam par défaut, alors j'ai changé le type des trois table en Innodb pour utiliser la notion de clé étrangère comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ALTER TABLE nom_table TYPE=Innod;
    j'ai fait les trois insertions suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    insert into serveur values ('dns','192.168.80.128','192.127.2.13');
    insert into service (nom_service,num_port,path_log) values ('bind','12','fff');
     insert into serveur_service (nom_machine) values ('dns');
    l'option ON CASCADE permet de faire la suppression en cascade; alor en écrivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    delete from serveur where nom_machine='dns';
    la ligne ou nom_machine=dns est supprimé dans la table "serveur" mais ell n'est pas supprimée automatiquement dans la table "serveur_service"!!!! alors que ON DELETE CASCADA devrait servir à ça,autrement dit, suppratiquement l'enregistremnt de la table "serveur_service"

    aidez moi svp à réaliser ce que je veux

    merci d'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    que te donnent les requêtes suivantes ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SHOW CREATE TABLE serveur_service ;
    SHOW CREATE TABLE serveur ;

  3. #3
    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
    nom_machine comme clé primaire, c'est pas top ! Tu devrais utiliser un identifiant auto-incrémenté.
    Et pour rendre l'index plus sélectif, tu devrais mettre l'identifiant de la machine en premier dans la clé primaire double de la table associative.

    Dans le déroulé de ton scénario, tu crées la table avec des clés étrangères avant de la passer en InnoDB. Comme le texte concernant les clés étrangères est purement et simplement ignoré lors de la création d'une table en MyISAM, tes clés n'ont pas été créées réellement.

    D'où la demande d'Antoun qui veut voir la description des tables.
    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 !

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 78
    Par défaut
    salut,

    voici les résultat de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    show create table serveur;
    show create tables serveur_service;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    +-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table           | Create Table                                                                                                                                                                                                                                                    |
    +-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | serveur_service | CREATE TABLE `serveur_service` (
      `Id_service` int(11) NOT NULL auto_increment,
      `nom_machine` varchar(20) NOT NULL,
      PRIMARY KEY  (`Id_service`,`nom_machine`),
      KEY `nom_machine` (`nom_machine`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 | 
    +-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.01 sec)
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    -----------------------+
    | serveur | CREATE TABLE `serveur` (
      `nom_machine` varchar(20) NOT NULL,
      `IP_privee` varchar(20) default NULL,
      `IP_publique` varchar(20) default NULL,
      PRIMARY KEY  (`nom_machine`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 | 
    +---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.01 sec)
    Pour le choix de la clé primaire nom_machine, j'ai d'autre intéret pour ne pas choisir un identifiant auto-increment. j'ai besoin que sa se soit un nom machine unique car je travaille sur une application demandant ceci.

    espérant que quele'un m'aide pour le problème de la suppression.

    merci

  5. #5
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    Comme Phil te l'a expliqué, et comme tu peux le voir sur les SHOW CREATE, les FK ne sont pas là. Il faut que tu les re-crées.

  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
    Citation Envoyé par lamou23 Voir le message
    Pour le choix de la clé primaire nom_machine, j'ai d'autre intéret pour ne pas choisir un identifiant auto-increment. j'ai besoin que sa se soit un nom machine unique car je travaille sur une application demandant ceci.
    Rien ne t'empêche de mettre un index de type UNIQUE sur le nom_machine tout en ayant une clé primaire formée d'un identifiant entier auto-incrémenté. C'est même comme ça qu'il est recommandé de faire !
    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 !

  7. #7
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 78
    Par défaut
    comment je recrée les clés étrangères , je dois recréer toutes les tables à nouveau??

  8. #8
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 78
    Par défaut
    pour le problème de nom machine qui est déclaré comme clé primaire,je dois alors rajouter un identificateur auto-increment comme clé primaire et déclarer nom_machine comme ceci:

    UNIQUE nom_machine varchar(20) NOT NULL,

    ???

  9. #9
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    Citation Envoyé par lamou23 Voir le message
    comment je recrée les clés étrangères , je dois recréer toutes les tables à nouveau??
    Non !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ALTER TABLE serveur_service 
      ADD FOREIGN KEY (Id_service) REFERENCES service(Id_service) ON DELETE CASCADE ;
    ALTER TABLE serveur_service 
      ADD FOREIGN KEY(nom_machine) REFERENCES serveur(nom_machine) ON DELETE CASCADE ;

    Citation Envoyé par lamou23 Voir le message
    pour le problème de nom machine qui est déclaré comme clé primaire,je dois alors rajouter un identificateur auto-increment comme clé primaire et déclarer nom_machine comme ceci:

    UNIQUE nom_machine varchar(20) NOT NULL,

    ???
    On va déjà essayer de faire fonctionner les FK, on verra les finitions ensuite...

  10. #10
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 78
    Par défaut
    salut,

    je te remercie beaucoup, effectivement j'ai recréé les clés étrangères et quand j'ai supprimé l'enregistrement de la table serveur,il a été supprimé automatiquement de la table associative serveur_service

    merci

  11. #11
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    cool !

    Voici pour mettre en place la clé primaire en numéro auto :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    -- pour trouver le nom de la FK vers serveur
    SHOW CREATE TABLE serveur_service ;
     
    -- en supposant qu'il s'agisse de serveur_service_ibfk_2 :
    alter table serveur_service drop foreign key serveur_service_ibfk_2 ;
     
    ALTER TABLE serveur DROP PRIMARY KEY ;
    ALTER TABLE serveur ADD IDmachine INT auto_increment primary key first;
    ALTER TABLE serveur ADD UNIQUE KEY (nom_machine) ;
    alter table serveur_service 
    add foreign key (nom_machine) REFERENCES serveur(nom_machine) ON DELETE CASCADE ;
    Ceci dit, je serais moins catégorique que Phil sur l'obligation d'avoir une clef numérique...

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

Discussions similaires

  1. [Artichow] Comment créer un graphe à partir d'une table mysql avec deux colonnes
    Par Amel_B dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 24/12/2013, 15h50
  2. [Excel] Générer un fichier excel à partir d'une table mysql + symfony 2
    Par Jerniti dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 23/05/2013, 12h33
  3. Réponses: 1
    Dernier message: 20/05/2010, 10h41
  4. [MySQL] Remplir une liste à partir d'une table MySQL
    Par missastro dans le forum PHP & Base de données
    Réponses: 25
    Dernier message: 27/08/2008, 17h42
  5. Réponses: 12
    Dernier message: 28/11/2006, 15h34

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