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 :

ON DELETE CASCADE ne fonctionne pas


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur

    Avatar de Torgar
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2007
    Messages
    2 334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2007
    Messages : 2 334
    Par défaut ON DELETE CASCADE ne fonctionne pas
    Bonjour à toutes et à tous,

    Je suis en train de créer un site internet sur le thème du rallye avec un module de gestion d'articles.

    Configuration de développement :

    PHP : v5.2.0
    MySQL : Client API v5.0.22 / Version du serveur : 5.0.27-community-log
    PhpMyAdmin : v3.2.5


    J'utilise donc une base de données que voici :
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    -- -----------------------------------------------------
    -- Table `membres`
    -- -----------------------------------------------------
    CREATE  TABLE IF NOT EXISTS `membres` (
      `mem_id` INT NOT NULL AUTO_INCREMENT ,
      `mem_pseudo` VARCHAR(45) NOT NULL ,
      `mem_nom` VARCHAR(45) NOT NULL ,
      `mem_pnom` VARCHAR(45) NOT NULL ,
      `mem_mail` VARCHAR(128) NOT NULL ,
      `mem_pwd` VARCHAR(40) NOT NULL ,
      `mem_addr` VARCHAR(128) NULL ,
      `mem_ville` VARCHAR(64) NULL ,
      `mem_cp` VARCHAR(45) NULL ,
      `mem_pays` VARCHAR(45) NULL ,
      `mem_tel` VARCHAR(45) NULL ,
      `mem_date_insc` INT NOT NULL ,
      `mem_date_last_co` INT NOT NULL ,
      `mem_newsletter` TINYINT(1) NOT NULL DEFAULT 0 ,
      `mem_actif` TINYINT(1) NULL DEFAULT 1 ,
      PRIMARY KEY (`mem_id`) )
    ENGINE = InnoDB;
     
     
    -- -----------------------------------------------------
    -- Table `categories`
    -- -----------------------------------------------------
    CREATE  TABLE IF NOT EXISTS `categories` (
      `cat_id` INT NOT NULL AUTO_INCREMENT ,
      `cat_libel` VARCHAR(45) NOT NULL ,
      PRIMARY KEY (`cat_id`) )
    ENGINE = InnoDB;
     
     
    -- -----------------------------------------------------
    -- Table `saison`
    -- -----------------------------------------------------
    CREATE  TABLE IF NOT EXISTS `saison` (
      `sai_id` INT NOT NULL AUTO_INCREMENT ,
      `sai_libel` VARCHAR(4) NOT NULL ,
      PRIMARY KEY (`sai_id`) )
    ENGINE = InnoDB;
     
     
    -- -----------------------------------------------------
    -- Table `rallye`
    -- -----------------------------------------------------
    CREATE  TABLE IF NOT EXISTS `rallye` (
      `ral_id` INT NOT NULL AUTO_INCREMENT ,
      `ral_libel` VARCHAR(64) NOT NULL ,
      `sai_id` INT NOT NULL ,
      PRIMARY KEY (`ral_id`) ,
      INDEX `sai_id` (`sai_id` ASC) ,
      CONSTRAINT `sai_id`
        FOREIGN KEY (`sai_id` )
        REFERENCES `saison` (`sai_id` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
     
     
    -- -----------------------------------------------------
    -- Table `articles`
    -- -----------------------------------------------------
    CREATE  TABLE IF NOT EXISTS `articles` (
      `art_id` INT NOT NULL AUTO_INCREMENT ,
      `art_libel` VARCHAR(64) NOT NULL ,
      `art_contenu` LONGTEXT NOT NULL ,
      `art_date_crea` INT NOT NULL ,
      `art_date_modif` INT NULL ,
      `mem_id` INT NOT NULL ,
      `cat_id` INT NOT NULL ,
      `ral_id` INT NULL ,
      PRIMARY KEY (`art_id`) ,
      INDEX `mem_id` (`mem_id` ASC) ,
      INDEX `cat_id` (`cat_id` ASC) ,
      INDEX `ral_id` (`ral_id` ASC) ,
      CONSTRAINT `mem_id`
        FOREIGN KEY (`mem_id` )
        REFERENCES `membres` (`mem_id` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION,
      CONSTRAINT `cat_id`
        FOREIGN KEY (`cat_id` )
        REFERENCES `categories` (`cat_id` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION,
      CONSTRAINT `ral_id`
        FOREIGN KEY (`ral_id` )
        REFERENCES `rallye` (`ral_id` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
     
     
    -- -----------------------------------------------------
    -- Table `reponses`
    -- -----------------------------------------------------
    CREATE  TABLE IF NOT EXISTS `reponses` (
      `rep_id` INT NOT NULL AUTO_INCREMENT ,
      `rep_cont` LONGTEXT NOT NULL ,
      `rep_date_crea` INT NOT NULL ,
      `mem_id` INT NULL ,
      `vis_nom` VARCHAR(45) NULL ,
      `vis_pnom` VARCHAR(45) NULL ,
      `vis_mail` VARCHAR(128) NULL ,
      PRIMARY KEY (`rep_id`) )
    ENGINE = InnoDB;
     
     
    -- -----------------------------------------------------
    -- Table `contenir`
    -- -----------------------------------------------------
    CREATE  TABLE IF NOT EXISTS `contenir` (
      `art_id` INT NOT NULL ,
      `rep_id` INT NOT NULL ,
      PRIMARY KEY (`art_id`, `rep_id`) ,
      INDEX `rep_id` (`rep_id` ASC) ,
      INDEX `art_id` (`art_id` ASC) ,
      CONSTRAINT `rep_id`
        FOREIGN KEY (`rep_id` )
        REFERENCES `reponses` (`rep_id` )
        ON DELETE CASCADE
        ON UPDATE NO ACTION,
      CONSTRAINT `art_id`
        FOREIGN KEY (`art_id` )
        REFERENCES `articles` (`art_id` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
    Maintenant le problème :

    Lorsque je veux supprimer un article, et donc ses réponses, le ON DELETE CASCADE ne se fait pas.

    J'ai pourtant bien défini ma clé étrangère (contenir.`rep_id`) mise en relation vers ma clé primaire (reponses.`rep_id`) sur laquelle le ON DELETE doit se faire.

    Pour faire la suppression j'utilise cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM contenir WHERE art_id = 1
    Je précise que je n'ai pas d'erreur dans les logs et ma table `contenir` se vide correctement.

    Si quelqu'un a une idée ou une piste de réflexion, je suis preneur.

    Merci.
    Je ne suis pas schizophrène, nous sommes unanime !!!

    ► Pensez à la balise code et au CODE HTML GENERE !!!!
    ► Au si c'est le cas et au à ceux qui vous ont aidé.
    Vous souhaitez participer aux rubriques CSS et (X)HTML ? Contactez-nous !

    Créer des colonnes de même hauteur en CSS
    Glossaire CSS
    Les bordures en CSS3
    Les transitions en CSS3

  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 Torgar Voir le message
    Lorsque je veux supprimer un article,

    ...

    Pour faire la suppression j'utilise cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM contenir WHERE art_id = 1
    Tu ne vois pas un problème ?

    C'est quand tu supprimeras un article dans la table articles que les lignes de la table contenir faisant référence à cet article seront automatiquement supprimées.
    L'inverse n'est pas vrai et heureusement !
    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
    Rédacteur

    Avatar de Torgar
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2007
    Messages
    2 334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2007
    Messages : 2 334
    Par défaut
    Tout d'abord, merci d'avoir pris le temps de me répondre.

    En effet, j'avais pris le problème à l'envers

    Et donc, comment faire alors, pour supprimer les `reponses` liées à l'article que je supprime ?

    Car, je suis d'accord qu'en faisant un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM articles WHERE art_id = 1
    je supprime bien l'article et les références de la table contenir pour cet article. Mais les réponses à cet article ne sont pas supprimées.

    Faut-il placer un ON DELETE ailleurs que sur la relation contenir.`rep_id` -> reponses.`rep_id` ou carrément procéder autrement ?
    Je ne suis pas schizophrène, nous sommes unanime !!!

    ► Pensez à la balise code et au CODE HTML GENERE !!!!
    ► Au si c'est le cas et au à ceux qui vous ont aidé.
    Vous souhaitez participer aux rubriques CSS et (X)HTML ? Contactez-nous !

    Créer des colonnes de même hauteur en CSS
    Glossaire CSS
    Les bordures en CSS3
    Les transitions en CSS3

  4. #4
    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
    D'après la structure de tes tables, tu as l'association suivante :
    Article -0,n----Contenir----0,n- Réponse

    Ce qui suppose qu'une réponse peut se rapporter à plusieurs articles.

    Si tu supprimes les réponses liées à l'article 1 et que parmi elles il y en a qui sont aussi liées à l'article 2, il ne faut pas supprimer ces réponses.

    C'est bien pour ça que les CASCADE ne fonctionne que dans un sens !

    Ou alors c'est que l'association a été mal modélisée et il faut changer la structure des tables en conséquence.
    Si une réponse ne se rapporte qu'à un seul article, on a l'association suivante :
    Article -0,n----Contenir----1,1- Réponse

    Et dans ce cas, plus besoin de la table associative Contenir mais simplement d'une clé étrangère dans la table Réponse faisant référence à l'identifiant de l'article.
    Si tu supprime un article, avec ON DELETE CASCADE, toutes les réponses liées à cet article seront supprimées.
    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 !

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

Discussions similaires

  1. [WD17] Suppression en cascade ne fonctionne pas sur base sqlite
    Par Christophe Charron dans le forum WinDev
    Réponses: 11
    Dernier message: 03/09/2012, 22h56
  2. Delete qui ne fonctionne pas
    Par sam01 dans le forum Requêtes
    Réponses: 6
    Dernier message: 31/08/2010, 17h14
  3. 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
  4. Delete ne fonctionne pas avec mon gridview
    Par NicoNGRI dans le forum ASP.NET
    Réponses: 2
    Dernier message: 26/10/2006, 08h52
  5. DELETE qui ne fonctionne pas
    Par pmboutteau dans le forum ASP
    Réponses: 9
    Dernier message: 14/10/2005, 13h50

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