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 :

Delete en cascade ne fonctionne pas


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 6
    Points : 17
    Points
    17
    Par défaut Delete en cascade ne fonctionne pas
    Bonjour,
    j'ai un petit problème au niveau de ma base de donnée u'il s'agit d'un dictionnaire de 3 tables

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    create table Mot(
    id int(10) primary key auto increment,
    labelle varchar(50),
    type varchar(10),
    description text,
    );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    creat table synonyme 
    ( id_mot int(10)  references mot(id) on delete cascade,
    id_dynonyme int(10)  references mot(id) on delete cascade ,
    );

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    create table equivalent 
    ( id_equivalent int(10) references mot(id) on delete cascade,
    id_mot int(10) references mot(id) on delete cascade,
    );

    j'ai inserer quelque ligne comme le suivant:

    mot(1,"to talk","verbe","To exchange thoughts or opinions in spoken or sign language")
    mot(2," to communicate","verbe","To convey information about");
    mot(3,"to gossip","verbe","Rumor or talk of a personal");


    synonyme(1,2)
    synonyme(1,3)

    le problème est le suivant :
    si je supprime le mot dont id= 1 ,toutes les lignes de la table synonyme qui ont id_mot=1 ne sont pas supprimées !!!!!!
    quelqu'un peut-il m'expliquer pourquoi ???

  2. #2
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut Super II.

    Vous devez respecter la syntaxe de la clef étrangère pour que cela fonctionne normalement.
    Voici un exemple :
    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
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `mot`
    --------------
     
    --------------
    CREATE TABLE `mot`
    (
      `id`            integer unsigned NOT NULL AUTO_INCREMENT primary key,
      `labelle`       varchar(255)     NOT NULL,
      `type`          varchar(255)     NOT NULL,
      `description`   varchar(255)     NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `mot` (`labelle`, `type`,`description`) VALUES
      ('to talk',        'verbe','To exchange thoughts or opinions in spoken or sign language'),
      ('to communicate', 'verbe','To convey information about'),
      ('to gossip',      'verbe','Rumor or talk of a personal')
    --------------
     
    --------------
    select * from mot
    --------------
     
    +----+----------------+-------+-------------------------------------------------------------+
    | id | labelle        | type  | description                                                 |
    +----+----------------+-------+-------------------------------------------------------------+
    |  1 | to talk        | verbe | To exchange thoughts or opinions in spoken or sign language |
    |  2 | to communicate | verbe | To convey information about                                 |
    |  3 | to gossip      | verbe | Rumor or talk of a personal                                 |
    +----+----------------+-------+-------------------------------------------------------------+
    --------------
    DROP TABLE IF EXISTS `synonyme`
    --------------
     
    --------------
    CREATE TABLE `synonyme`
    (
      `id_mot`      integer unsigned NOT NULL,
      `id_synonyme` integer unsigned NOT NULL,
      CONSTRAINT `FK_MOT`      FOREIGN KEY (`id_mot`)      REFERENCES `mot` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `FK_SYNONYME` FOREIGN KEY (`id_synonyme`) REFERENCES `mot` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
      primary key (`id_mot`, `id_synonyme`)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `synonyme` (`id_mot`,`id_synonyme`) VALUES
      (1, 2), (1, 3), (3, 2), (3, 1)
    --------------
     
    --------------
    select * from synonyme
    --------------
     
    +--------+-------------+
    | id_mot | id_synonyme |
    +--------+-------------+
    |      3 |           1 |
    |      1 |           2 |
    |      3 |           2 |
    |      1 |           3 |
    +--------+-------------+
    --------------
    delete from `mot` where id = 1
    --------------
     
    --------------
    select * from mot
    --------------
     
    +----+----------------+-------+-----------------------------+
    | id | labelle        | type  | description                 |
    +----+----------------+-------+-----------------------------+
    |  2 | to communicate | verbe | To convey information about |
    |  3 | to gossip      | verbe | Rumor or talk of a personal |
    +----+----------------+-------+-----------------------------+
    --------------
    select * from synonyme
    --------------
     
    +--------+-------------+
    | id_mot | id_synonyme |
    +--------+-------------+
    |      3 |           2 |
    +--------+-------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 6
    Points : 17
    Points
    17
    Par défaut
    Bonjour ,
    merci pour vous aide.
    mais ce que je veux ,c'est pourquoi il ne fonctionne pas même quand il est syntaxiquement correct !!!!!
    Bon ,je ne comprends pas pourquoi quand j'ai ajoutée un contraint comme vous l'avez fait (primary key(id_syn,id_mot), même je ne voix pas l'utilité de les mettre comme clés primaire!!!) au niveau de la table synonyme ,
    c'est le même problème (le delete en cascade ne fonctionne pas) .
    mais si je met votre code ,il marche ,je ne le comprends pas ,pouvez vous m'expliquer pourquoi

  4. #4
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut Super II.

    Citation Envoyé par Super II
    ce que je veux ,c'est pourquoi il ne fonctionne pas même quand il est syntaxiquement correct !!!!!
    Le pourquoi, je vous l'ai donné précédemment.
    Pour déclarer une clef étrangère, vous devez utiliser la syntaxe que je vous ai donné.
    Voici le lien vers la documentation officielle de MySql : http://dev.mysql.com/doc/refman/5.7/...eign-keys.html
    C'est une déclarative indépendante de la déclarative de la colonne.

    De plus, je ne voie nulle part dans votre exemple, les mots clefs foreign key, pour dire que c'est une déclarative concernant les clef étrangères.
    Même si la syntaxe est correcte, cette déclarative ne correspond pas à une clef étrangère.

    Je ne sais pas à quoi se rapport cette déclarative. Peut-être que c'est un bug de MySql ???

    J'ai vérifié en reprenant votre exemple et en effet, aucune erreur de syntaxe et la suppression ne se fait pas.
    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
     
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `mot`
    --------------
     
    --------------
    CREATE TABLE `mot`
    (
      `id`            integer unsigned NOT NULL AUTO_INCREMENT primary key,
      `labelle`       varchar(255)     NOT NULL,
      `type`          varchar(255)     NOT NULL,
      `description`   varchar(255)     NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `mot` (`labelle`, `type`,`description`) VALUES
      ('to talk',        'verbe','To exchange thoughts or opinions in spoken or sign language'),
      ('to communicate', 'verbe','To convey information about'),
      ('to gossip',      'verbe','Rumor or talk of a personal')
    --------------
     
    --------------
    select * from mot
    --------------
     
    +----+----------------+-------+-------------------------------------------------------------+
    | id | labelle        | type  | description                                                 |
    +----+----------------+-------+-------------------------------------------------------------+
    |  1 | to talk        | verbe | To exchange thoughts or opinions in spoken or sign language |
    |  2 | to communicate | verbe | To convey information about                                 |
    |  3 | to gossip      | verbe | Rumor or talk of a personal                                 |
    +----+----------------+-------+-------------------------------------------------------------+
    --------------
    DROP TABLE IF EXISTS `synonyme`
    --------------
     
    --------------
    CREATE TABLE `synonyme`
    (
      `id_mot`      integer unsigned NOT NULL REFERENCES `mot` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
      `id_synonyme` integer unsigned NOT NULL REFERENCES `mot` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
      primary key (`id_mot`, `id_synonyme`)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `synonyme` (`id_mot`,`id_synonyme`) VALUES
      (1, 2), (1, 3), (3, 2), (3, 1)
    --------------
     
    --------------
    select * from synonyme
    --------------
     
    +--------+-------------+
    | id_mot | id_synonyme |
    +--------+-------------+
    |      1 |           2 |
    |      1 |           3 |
    |      3 |           1 |
    |      3 |           2 |
    +--------+-------------+
    --------------
    delete from `mot` where id = 1
    --------------
     
    --------------
    select * from mot
    --------------
     
    +----+----------------+-------+-----------------------------+
    | id | labelle        | type  | description                 |
    +----+----------------+-------+-----------------------------+
    |  2 | to communicate | verbe | To convey information about |
    |  3 | to gossip      | verbe | Rumor or talk of a personal |
    +----+----------------+-------+-----------------------------+
    --------------
    select * from synonyme
    --------------
     
    +--------+-------------+
    | id_mot | id_synonyme |
    +--------+-------------+
    |      1 |           2 |
    |      1 |           3 |
    |      3 |           1 |
    |      3 |           2 |
    +--------+-------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    J'ai vérifié sous PhpMyAdmin, aucune clef étrangère n'a été créé. Je confirme, ce n'est pas la bonne déclarative.

    Citation Envoyé par Super II
    Bon ,je ne comprends pas pourquoi quand j'ai ajoutée un contraint comme vous l'avez fait (primary key(id_syn,id_mot), même je ne voix pas l'utilité de les mettre comme clés primaire!!!) au niveau de la table synonyme, c'est le même problème (le delete en cascade ne fonctionne pas) .
    J'ai mis une clef primaire pour rendre unique le couple (id_mot,id_synonyme). Et puis, c'est bizarre de ne pas mettre une clef primaire sur une table.

    La primary key, dans l'exemple de la table synonyme n'a aucun rapport avec votre problème, c'est-à-dire la déclarative de la clef étrangère.
    Ne vous focalisez pas sur cela, le problème n'est pas là.

    Citation Envoyé par Super II
    mais si je met votre code ,il marche ,je ne le comprends pas ,pouvez vous m'expliquer pourquoi
    La seule explication que je peux vous donner, c'est que vous n'utilisez pas la bonne déclarative pour les clefs étrangères.
    Il faut impérativement mettre les mots clefs "foreign key" pour dire que c'est une clef étrangère.

    Le mieux est de lire la documentation officielle de MySql : http://dev.mysql.com/doc/refman/5.7/...ate-table.html

    Désolé, je ne peux pas faire plus.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 6
    Points : 17
    Points
    17
    Par défaut
    salut,

    De plus, je ne voie nulle part dans votre exemple, les mots clefs foreign key, pour dire que c'est une déclarative concernant les clef étrangères.
    Même si la syntaxe est correcte, cette déclarative ne correspond pas à une clef étrangère.
    .
    oui je l'ai bien remarqué aprés quelque essais .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    creat table synonyme 
    ( id_mot int(10) references mot(id) on delete cascade,
    id_dynonyme int(10) references mot(id) on delete cascade ,
    );


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TABLE `synonyme`
    (
      `id_mot`      integer unsigned NOT NULL,
      `id_synonyme` integer unsigned NOT NULL,
      CONSTRAINT `FK_MOT`      FOREIGN KEY (`id_mot`)      REFERENCES `mot` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `FK_SYNONYME` FOREIGN KEY (`id_synonyme`) REFERENCES `mot` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
      primary key (`id_mot`, `id_synonyme`)
    )
    j'ai croie que ces deux declaration sont equivalent mais ils ne sont pas :/
    merci en tout cas.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/03/2014, 12h18
  2. ON DELETE CASCADE ne fonctionne pas
    Par Torgar dans le forum Requêtes
    Réponses: 3
    Dernier message: 04/02/2010, 17h14
  3. [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
  4. Delete on cascade avec SQL server
    Par fadoua dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 14/01/2004, 11h02
  5. delete en cascade
    Par bruno270579 dans le forum Requêtes
    Réponses: 8
    Dernier message: 16/12/2003, 17h17

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