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

MySQL Discussion :

[MySQL] ON CASCADE ?


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 625
    Par défaut [MySQL] ON CASCADE ?
    bonjour à vous !

    Voici 3 tables, j'aimerai faire plusieurs choses.

    Si je supprime 1 occurrence dans la table test que ça supprime son occurrence qui suit dans test3 et test2.

    exemple bidon lol:

    test = membre
    test2 = chat
    test3 = appartient

    si je supprime un membre, ça supprime son appartenance avec le chat mais supprime également le chat qui lui ai propre.

    mais un membre peut perdre un chat donc si je supprime le chat dans la table chat il faut que ça supprime aussi l'occurrence dans appartient.

    vous me suivez ?

    je travail sous MySQL
    je me suis aidé de cette page pour essayer de comprendre mais je n'ai pas réussi:
    http://dev.mysql.com/doc/refman/5.0/...nstraints.html

    est-ce que vous pouvez m'aider s'il vous plait ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    CREATE TABLE IF NOT EXISTS test3 (
      test2_id int(11) NOT NULL,
      test_id int(11) NOT NULL,
      PRIMARY KEY (test2_id,test_id),
      KEY FK_test (test_id),
      KEY FK_test2 (test2_id)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
     
     
    CREATE TABLE IF NOT EXISTS test2 (
      test2_id int(11) NOT NULL AUTO_INCREMENT,
      test2_txt varchar(50) DEFAULT NULL,
      PRIMARY KEY (test2_id)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;
     
    CREATE TABLE IF NOT EXISTS test (
      test_id int(11) NOT NULL AUTO_INCREMENT,
      test_txt varchar(50) NOT NULL,
      PRIMARY KEY (test_id)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
     
    ALTER TABLE test3
      ADD CONSTRAINT FK_test FOREIGN KEY (test_id) REFERENCES test (me_id),
      ADD CONSTRAINT FK_test2 FOREIGN KEY (test2_id) REFERENCES test2 (test2_id);

  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
    Citation Envoyé par noobyyy Voir le message
    exemple bidon lol:

    test = membre
    test2 = chat
    test3 = appartient
    Ta structure suppose qu'un chat puisse appartenir à plusieurs membres.

    Le MCD correspondant est celui-ci :
    chat -0,n----appartient----0,n- membre

    si je supprime un membre, ça supprime son appartenance avec le chat mais supprime également le chat qui lui ai propre.
    Et si ce chat appartient aussi à un autre membre, ce second membre a tout à coup perdu son chat ! Il ne va pas être content !

    Un peu de théorie maintenant...
    ON CASCADE s'applique à la table qui contient la clé étrangère, pas l'inverse, et heureusement !
    Je prends un autre cas plus concret :
    Règle de gestion :
    Une personne peut posséder plusieurs voitures et une voiture est possédée par une seule personne.

    MCD :
    Personne -0,n----Posséder----1,1- Voiture

    Tables :
    Personne (p_id, p_nom...)
    Voiture (v_id, v_id_personne, ...)

    Dans la table Voiture figure la contrainte de clé étrangère référençant l'identifiant de la personne.
    Avec ON CASCADE, si je supprime la personne, je supprime la voiture ; pourquoi pas !
    Mais si je supprime la voiture et que ça supprime aussi la personne, et que celle-ci possède d'autres voitures, celles-ci se retrouveront sans propriétaire.

    Dans une association avec des cardinalités (0,n - 0,n), les clés étrangères sont dans la table associative et c'est la suppression d'une instance d'une des entités qui fera disparaitre l'instance de l'association.
    Mais la suppression de l'instance de l'association ne doit jamais supprimer les instances des entités !

    Donc ceci :
    mais un membre peut perdre un chat donc si je supprime le chat dans la table chat il faut que ça supprime aussi l'occurrence dans appartient.
    Ne doit jamais arriver avec l'association que tu as décrite.

    Donne nous ton besoin réel et nous t'aideront à le modéliser et à l'implanter correctement.
    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 éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 625
    Par défaut
    c'est bon j'ai trouvé mon erreur, je te remercie beaucoup !

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 625
    Par défaut
    je relance le topic car je n'arrive pas à faire marcher cette exemple:

    source: http://dev.mysql.com/doc/refman/5.0/...nstraints.html
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    CREATE TABLE product (category INT NOT NULL, id INT NOT NULL,
                          price DECIMAL,
                          PRIMARY KEY(category, id)) TYPE=INNODB;
    CREATE TABLE customer (id INT NOT NULL,
                          PRIMARY KEY (id)) TYPE=INNODB;
    CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT,
                          product_category INT NOT NULL,
                          product_id INT NOT NULL,
                          customer_id INT NOT NULL,
                          PRIMARY KEY(no),
                          INDEX (product_category, product_id),
                          FOREIGN KEY (product_category, product_id)
                            REFERENCES product(category, id)
                            ON UPDATE CASCADE ON DELETE RESTRICT,
                          INDEX (customer_id),
                          FOREIGN KEY (customer_id)
                            REFERENCES customer(id)) TYPE=INNODB;
    Impossible de supprimer un client, surement à cause de ON DELETE RESTRICT
    mais si je veux le supprimer comment faire ?

    merci.

  5. #5
    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
    Il n'y a pas d'instruction ON sur la clé étrangère référençant le client.

    Je ne trouve pas dans la doc quelle est la valeur par défaut en l'absence d'instruction.

    Bonne pratique : toujours spécifier le comportement de l'intégrité référentielle !
    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 !

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 625
    Par défaut
    est-ce aussi normal alors que si on supprime un produit c'est impossible aussi ? a moins que je me sois trompé dans les valeurs..

    c'est pas très clair leur exemple...

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

Discussions similaires

  1. [AJAX] Select en cascade ajax + mysql
    Par artkap dans le forum AJAX
    Réponses: 11
    Dernier message: 29/01/2010, 22h20
  2. Réponses: 4
    Dernier message: 13/10/2009, 14h06
  3. Listes SELECT en cascade, alimentées par des tables mysql
    Par Lamanne dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 07/02/2009, 22h24
  4. Clé étrangère et CASCADE ne fonctionne pas (MySQL 5.0)
    Par ctobini dans le forum Administration
    Réponses: 3
    Dernier message: 07/11/2007, 15h44
  5. [MySQL] DELETE en cascade..ma requete ne marche pas
    Par debie1108 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 21/10/2006, 16h54

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