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 :

problème de "on delete cascade"


Sujet :

MySQL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 200
    Par défaut problème de "on delete cascade"
    Bonjour , je ne sais pas d'ou vient le problème j'espère que vous pourrez m'aiguiller.
    Alors :
    • je possède une table fournisseur avec comme clé primaire "four_id"
    • dans ma table produit je possède la clé étrangère "#four_id" qui fait référence à celle de fournisseur


    J'ai ajouté cette contrainte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER TABLE produit ADD CONSTRAINT fk_produit 
      FOREIGN KEY (`#four_id`) REFERENCES fournisseur (four_id) 
        ON DELETE CASCADE
    Je pensais que cette contrainte allait permettre lorsque je supprime un fournisseur de supprimer tous les produits associés.

    Pourriez-vous m'indiquer une idée ou me dire pourquoi cela ne fonctionne pas ?

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Par défaut
    Peux-tu :

    1) nous dire en quoi "ça ne marche pas"... message d'erreur, non-suppression, etc.

    2) faire un SHOW CREATE TABLE sur chacune de des deux tables, et nous donner le résultat ?

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 331
    Par défaut
    Tes tables sont bien en INNODB?

    Rachid A.

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    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 814
    Billets dans le blog
    14
    Par défaut
    Au passage, ton modèle suppose qu'un produit soit fourni par un seul fournisseur, ce qui est inhabituel dans les entreprises.
    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 !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 200
    Par défaut
    Bonjour et merci pour vos réponses.

    Alors tout d'abord, dans mon cas, chaque produit a bien un seul fournisseur.
    Ensuite, lorsque je dis que cela ne fonctionne pas, cela signifie que lorsque je supprime un fournisseur, les produits ayant comme clé étrangère l'id de ce fournisseur ne sont pas effacés.

    Voici les 2 show create table :

    produit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     	CREATE TABLE `produit` (
     `prod_nom` varchar(30) NOT NULL DEFAULT '',
     `prod_compo` varchar(50) DEFAULT NULL,
     `prod_poids` int(4) DEFAULT NULL,
     `prod_remarque` text,
     `prod_stock` tinyint(4) DEFAULT NULL,
     `#four_raisonsoc` varchar(40) NOT NULL,
     PRIMARY KEY (`prod_nom`,`#four_raisonsoc`),
     KEY `fk_produit` (`#four_raisonsoc`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1
    fournisseur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE TABLE `fournisseur` (
     `four_raisonsoc` varchar(40) NOT NULL DEFAULT '',
     `four_resp` varchar(50) DEFAULT NULL,
     `four_adresse` varchar(100) DEFAULT NULL,
     `four_tel` varchar(20) DEFAULT NULL,
     `four_port` varchar(20) DEFAULT NULL,
     `four_fax` varchar(20) DEFAULT NULL,
     `four_mail` varchar(30) DEFAULT NULL,
     `four_remarque` text,
     PRIMARY KEY (`four_raisonsoc`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1
    Après, comment met-on une table en INNODB? Et à quoi sert-il?
    Merci.

  6. #6
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Citation Envoyé par bernidupont Voir le message
    comment met-on une table en INNODB? Et à quoi sert il?
    Saluton,
    En spécifiant ENGINE=INNODB.
    Le mode MyIsam ne gère pas les clés étrangères, disons qu'il en accepte la syntaxe mais ne sait pas s'en servir, contrairement au moteur InnoDB
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Par défaut
    Pour compléter la réponse de Kris... Il faut donc que tu passes les deux requêtes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ALTER TABLE produit ENGINE=InnoDB ;
    ALTER TABLE fournisseur ENGINE=InnoDB ;

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 331
    Par défaut
    Pour compléter les réponses ci-dessus.
    Avant de convertir tes tables en INNODB, vérifie d'abord que ce moteur est activé, en lançant la commande suivante :
    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
    mysql:root:b1> show engines;
    +------------+----------+----------------------------------------------------------------+
    | Engine     | Support  | Comment                                                        |
    +------------+----------+----------------------------------------------------------------+
    | MyISAM     | DEFAULT  | Default engine as of MySQL 3.23 with great performance         | 
    | MEMORY     | YES      | Hash based, stored in memory, useful for temporary tables      | 
    | InnoDB     | YES      | Supports transactions, row-level locking, and foreign keys     | 
    | BerkeleyDB | NO       | Supports transactions and page-level locking                   | 
    | BLACKHOLE  | YES      | /dev/null storage engine (anything you write to it disappears) | 
    | EXAMPLE    | NO       | Example storage engine                                         | 
    | ARCHIVE    | YES      | Archive storage engine                                         | 
    | CSV        | YES      | CSV storage engine                                             | 
    | ndbcluster | DISABLED | Clustered, fault-tolerant, memory-based tables                 | 
    | FEDERATED  | YES      | Federated MySQL storage engine                                 | 
    | MRG_MYISAM | YES      | Collection of identical MyISAM tables                          | 
    | ISAM       | NO       | Obsolete storage engine                                        | 
    +------------+----------+----------------------------------------------------------------+
    12 rows in set (0.00 sec)
    Si ce n'est pas le cas, active le moteur INNODB en commetant la ligne "skip_innodb" dans ton fichier de configuration my.cnf ou my.ini

    Rachid A.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 200
    Par défaut
    J'ai changé les deux tables en leur assignant le moteur InnoDB.
    J'ai bien regardé le moteur, Innob et il est bien activé.
    En voulant effacer un fournisseur, les produits associés à ce fournisseur ne sont pas effacés.

    voici la requête que j'avais exécutée pour rajouter la contrainte sur les produits:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER TABLE produit ADD CONSTRAINT fk_produit 
      FOREIGN KEY (`#four_raisonsoc`) 
      REFERENCES fournisseur (four_raisonsoc) ON DELETE CASCADE
    Cette action est bien effectuée, néanmoins est ce normal que "on delete cascade" n'apparaisse pas dans le schéma ci dessus?

    cf : "KEY `fk_produit` (`#four_raisonsoc`)"

  10. #10
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Par défaut
    Chez moi tout est OK... script du test :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    mysql> CREATE TABLE `produit` (
        ->  `prod_nom` varchar(30) NOT NULL DEFAULT '',
        ->  `prod_compo` varchar(50) DEFAULT NULL,
        ->  `prod_poids` int(4) DEFAULT NULL,
        ->  `prod_remarque` text,
        ->  `prod_stock` tinyint(4) DEFAULT NULL,
        ->  `#four_raisonsoc` varchar(40) NOT NULL,
        ->  PRIMARY KEY (`prod_nom`,`#four_raisonsoc`),
        ->  KEY `fk_produit` (`#four_raisonsoc`)
        -> ) engine=innodb ;
    Query OK, 0 rows affected (0.99 sec)
    
    mysql> CREATE TABLE `fournisseur` (
        ->  `four_raisonsoc` varchar(40) NOT NULL DEFAULT '',
        ->  `four_resp` varchar(50) DEFAULT NULL,
        ->  `four_adresse` varchar(100) DEFAULT NULL,
        ->  `four_tel` varchar(20) DEFAULT NULL,
        ->  `four_port` varchar(20) DEFAULT NULL,
        ->  `four_fax` varchar(20) DEFAULT NULL,
        ->  `four_mail` varchar(30) DEFAULT NULL,
        ->  `four_remarque` text,
        ->  PRIMARY KEY (`four_raisonsoc`)
        -> ) engine=innodb ;
    Query OK, 0 rows affected (0.14 sec)
    
    mysql> ALTER TABLE produit ADD CONSTRAINT fk_produit
        ->   FOREIGN KEY (`#four_raisonsoc`)
        ->   REFERENCES fournisseur (four_raisonsoc) ON DELETE CASCADE ;
    Query OK, 0 rows affected (0.31 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> insert into fournisseur(four_raisonsoc) values ('XXX') ;
    Query OK, 1 row affected (0.10 sec)
    
    mysql> insert into produit(`#four_raisonsoc`) values ('XXX') ;
    Query OK, 1 row affected (0.06 sec)
    
    mysql> delete from fournisseur ;
    Query OK, 1 row affected (0.07 sec)
    
    mysql> select * from produit ;
    Empty set (0.06 sec)
    
    mysql> show create table produit ;
    
    | Table   | Create Table
    
    | produit | CREATE TABLE `produit` (
      `prod_nom` varchar(30) NOT NULL DEFAULT '',
      `prod_compo` varchar(50) DEFAULT NULL,
      `prod_poids` int(4) DEFAULT NULL,
      `prod_remarque` text,
      `prod_stock` tinyint(4) DEFAULT NULL,
      `#four_raisonsoc` varchar(40) NOT NULL,
      PRIMARY KEY (`prod_nom`,`#four_raisonsoc`),
      KEY `fk_produit` (`#four_raisonsoc`),
      CONSTRAINT `fk_produit` FOREIGN KEY (`#four_raisonsoc`) REFERENCES `fournisseur` (`four_raisonsoc`) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
    
    1 row in set (0.07 sec)

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 200
    Par défaut
    Merci beaucoup, il devait y avoir un problème dans ma requête!
    Encore merci pour votre soutien, à très bientôt
    berni ;-)

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

Discussions similaires

  1. Problème "LoadModule ssl_module modules/mod_ssl.so"
    Par ldcarpathes dans le forum Apache
    Réponses: 9
    Dernier message: 24/01/2008, 11h07
  2. Delete cascade --> problème de temps de traitement
    Par celine31 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 11/01/2006, 12h03
  3. Formulaires : problème avec les slashes et les quotes
    Par GarGamel55 dans le forum Langage
    Réponses: 1
    Dernier message: 12/10/2005, 15h59

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