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

SQL Procédural MySQL Discussion :

UPDATE et DELETE sur une table parente


Sujet :

SQL Procédural MySQL

  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Points : 336
    Points
    336
    Par défaut UPDATE et DELETE sur une table parente
    Bonjour.
    En avançant dans mon projet, je me heurte à de nouveaux problèmes.
    Je souhaite pouvoir faire des delete sur des éléments d'une table parente utilisée par une autre avec des FK.
    Je souhaite que ces delete soient possibles et que les colonnes de la table fille pointent (FK) vers une valeur par défaut de la table parente.

    Je souhaite le UPDATE d'une table parente toujours possible.

    Est t-il possible et comment de faire cela côté BDD ?
    Merci de votre aide.

  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 344
    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 344
    Points : 18 919
    Points
    18 919
    Par défaut
    Salut 69Pierre.

    Citation Envoyé par 69Pierre
    Je souhaite pouvoir faire des delete sur des éléments d'une table parente utilisée par une autre avec des FK.
    Tu as une table "fils" qui est en relation avec la table "père" par l'intermédiaire d'une clef étrangère.
    Tu désires supprimer les lignes de la table père !
    Et tu voudrais que cela se fasse automatiquement aussi dans la table fils.

    Dans la table fils, tu mets ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CONSTRAINT `FK_01` FOREIGN KEY (`pere_id`) REFERENCES `pere` (`pere_id`) ON DELETE CASCADE ON UPDATE CASCADE
    La colonne "pere_id" se trouve bien sûr dans la table "père" et la table "fils".

    Cela fonctionne aussi bien pour le delete que pour le update.

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

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 059
    Points : 38 267
    Points
    38 267
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par 69Pierre Voir le message
    Je souhaite que ces delete soient possibles et que les colonnes de la table fille pointent (FK) vers une valeur par défaut de la table parente.
    Citation Envoyé par Artemus24 Voir le message
    Tu désires supprimer les lignes de la table père !
    Et tu voudrais que cela se fasse automatiquement aussi dans la table fils
    Pas vraiment, il souhaite rattacher les filles devenues orphelines, à une mère par défaut, on ne peut donc pas utiliser seulement l'intégrité référentielle, il faut un traitement pour les filles

  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 344
    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 344
    Points : 18 919
    Points
    18 919
    Par défaut
    Salut Escartefigue.

    En effet, je n'ai pas bien compris la question posée.
    Il serait bien que Pierre69 nous expose un peu plus clairement ce qu'il veut faire.

    qu'est-ce qu'il entend par "vers une valeur par défaut de la table parente" ?
    Un null par exemple ?

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

  5. #5
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Points : 336
    Points
    336
    Par défaut
    Bonjour et merci de m'aider.

    Je vais donner ma définition de table père et fils.
    fils : table ayant les valeurs d'une ses colonnes pointant vers un id de la table père
    La table fils a une clé étrangère.

    Soit T_Pere la table père contenant les id pere1, ..., perei, ...,pereN
    et T_Fils la table fils contenant les id fils1, ..., filsj, ..., filsM.

    Je souhaiterai que si (par exemple), les fils fils1, fil2 et fil3 ont pour FK pere6,
    je puisse supprimer dans T_Pere la ligne correspondant à l'id pere6.
    et que la valeur de la FK correspondante dans T_Fils pere6 soit remplacée pour les lignes de T_Fils qui la possèdent (ici celles correspondant au id fils1, fils2 et fils3) par un id correspondant à une valeur par défaut de la table T_Pere (par exemple l'id pere_defauft).


    Encore que je me rends compte que dans mon cas, il serait mieux de ne pas supprimer la ligne d'id pere6 mais de rajouter une colonne obsolète remplie par défaut à false qui passerait dans ce cas à true, ce qui serait plus simple mais empêcherait de faire l'exercice de style ci-dessus.

    Une deuxième question : dans le cas du UPDATE de la ligne correspondant à la ligne d'id pere6 dans T_Pere comment le rendre autorisé ?

  6. #6
    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 344
    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 344
    Points : 18 919
    Points
    18 919
    Par défaut
    Salut Pierre69.

    Je ne le fais pas exprès mais j'ai du mal à comprendre ce que tu cherches à faire.
    Je pense avoir compris mais j'ai quand même un doute sur ce que tu veux faire !

    Citation Envoyé par pierre69
    je puisse supprimer dans T_Pere la ligne correspondant à l'id pere6.
    Tout dépend de ce que tu as déclaré comme "foreign key" dans la table fils.

    Si tu mets : "on delete cascade on update cascade", la suppression de la ligne ayant pour 'id' pere_06, aura pour conséquence la suppression de toutes les lignes en relations dans la table fils.
    Dans les autres cas ("on delete restrict on update cascade"), la suppression ne pourra pas se faire tant qu'il existe des lignes en relation dans la table fils.

    Ce qui implique que tu dois modifier les lignes de la table fils avant de pouvoir supprimer la ligne de la table père.
    Voici un exemple pour modifier les lignes ayant pere_id = 3 en pere_id = 5 dans la table fils.
    Et ensuite, tu peux supprimer la ligne pere_id = 3 dans la table père.
    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
    --------------
    select * from pere
    --------------
     
    +---------+---------+
    | pere_id | libelle |
    +---------+---------+
    |       1 | rouge   |
    |       2 | vert    |
    |       3 | jaune   |
    |       4 | bleu    |
    |       5 | default |
    +---------+---------+
    --------------
    select * from fils
    --------------
     
    +---------+---------+----------+
    | fils_id | pere_id | nuance   |
    +---------+---------+----------+
    |       1 |       1 | carmin   |
    |       2 |       1 | cinabre  |
    |       3 |       2 | pomme    |
    |       4 |       3 | citron   |
    |       5 |       3 | ambre    |
    |       6 |       3 | moutarde |
    +---------+---------+----------+
    --------------
    delete from pere where pere_id = 3
    --------------
     
    ERROR 1451 (23000) at line 8: Cannot delete or update a parent row: a foreign key constraint fails (`base`.`fils`, CONSTRAINT `FK_01` FOREIGN KEY (`pere_id`) REFERENCES `pere` (`pere_id`) ON UPDATE CASCADE)
    --------------
    select * from pere
    --------------
     
    +---------+---------+
    | pere_id | libelle |
    +---------+---------+
    |       1 | rouge   |
    |       2 | vert    |
    |       3 | jaune   |
    |       4 | bleu    |
    |       5 | default |
    +---------+---------+
    --------------
    select * from fils
    --------------
     
    +---------+---------+----------+
    | fils_id | pere_id | nuance   |
    +---------+---------+----------+
    |       1 |       1 | carmin   |
    |       2 |       1 | cinabre  |
    |       3 |       2 | pomme    |
    |       4 |       3 | citron   |
    |       5 |       3 | ambre    |
    |       6 |       3 | moutarde |
    +---------+---------+----------+
    --------------
    update fils set pere_id = 5 where pere_id = 3
    --------------
     
    --------------
    delete from pere where pere_id = 3
    --------------
     
    --------------
    select * from pere
    --------------
     
    +---------+---------+
    | pere_id | libelle |
    +---------+---------+
    |       1 | rouge   |
    |       2 | vert    |
    |       4 | bleu    |
    |       5 | default |
    +---------+---------+
    --------------
    select * from fils
    --------------
     
    +---------+---------+----------+
    | fils_id | pere_id | nuance   |
    +---------+---------+----------+
    |       1 |       1 | carmin   |
    |       2 |       1 | cinabre  |
    |       3 |       2 | pomme    |
    |       4 |       5 | citron   |
    |       5 |       5 | ambre    |
    |       6 |       5 | moutarde |
    +---------+---------+----------+
     
    Appuyez sur une touche pour continuer...
    J'espère avoir répondu à ta question.

    Pour la seconde question, il suffit de mettre "on update cascade".
    Si tu remplaces pere_id = 3 par une autre valeur qui n'existe pas dans la table père et fils, alors tu peux faire le update.
    Dans le cas contraire, une erreur va te signaler que la valeur existe déjà.

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

  7. #7
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Points : 336
    Points
    336
    Par défaut
    OK merci.
    Je note : "on update cascade on update cascade" que je n'avais pas compris.
    Pour le reste, je vais voir.
    PS : qui a noté -1 ?

  8. #8
    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 344
    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 344
    Points : 18 919
    Points
    18 919
    Par défaut
    Salut pierre69.

    C'est "on delete cascade on update cascade".
    Cela signifie que tu peux, depuis la table père, supprimer ou mettre à jour, en cascade, toutes les valeurs qui sont en liens (foreign key) dans la table fils.

    Citation Envoyé par Pierre69
    PS : qui a noté -1 ?
    Moi aussi, j'aimerai savoir qui a eu le courage de me mal noter.
    Si la réponse est fausse, voire incorrecte, qu'il le dise ouvertement, et non en notant !
    Cela n'apporte strictement rien au sujet, ni à ceux qui liront par la suite ce sujet.
    Je peux très bien me tromper dans mes réponses et je m'en excuse.
    Si c'est le cas, un simple message avec des explications détaillées sera le bienvenue.

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

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

Discussions similaires

  1. Evenement Insert,Update,Delete sur une table
    Par olibara dans le forum Développement
    Réponses: 7
    Dernier message: 20/11/2013, 17h28
  2. Trigger delete sur une table réflexive
    Par oxino dans le forum PL/SQL
    Réponses: 4
    Dernier message: 29/06/2010, 12h17
  3. Réponses: 4
    Dernier message: 09/10/2009, 17h54
  4. Requête sur une table parent et 2 tables enfants
    Par DocDen dans le forum Langage SQL
    Réponses: 6
    Dernier message: 29/10/2008, 20h32
  5. probleme de delete sur une table avec somation
    Par galaad666 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 23/10/2006, 17h44

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