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

Langage SQL Discussion :

Modification d'une clé primaire


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 99
    Points : 59
    Points
    59
    Par défaut Modification d'une clé primaire
    Salut tout le monde. Est ce qu'il y a une solution pour que je puisse changer une clé primaire qui est une clé étrangère dans une table. Exple: je voudrai changer le matricule d'un client et que le matricule change dans la table commande ????

  2. #2
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    je voudrai changer le matricule d'un client et que le matricule change dans la table commande
    Avez-vous défini une contrainte d'intégrité référentielle entre les tables CLient et Commande ?
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 99
    Points : 59
    Points
    59
    Par défaut
    oui, j'ai mit dans la table commande (matricule) comme clé étrangère. c'est cette contrainte qui bloque la modification. je l'ai désactivé pour changer le matricule et bein ça ne se fait que dans la table client et non pas dans la table commande

  4. #4
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    L’objet de l’intégrité référentielle est de faire en sorte qu’on ne puisse pas se retrouver avec une commande sans client associé. Le fait de débrancher la contrainte référentielle fait ... qu’il n’y a plus de contrainte, donc que l’on puisse modifier la clé du client sans répercussion dans la table commande : c’est particulièrement redoutable.

    Il faut donc conserver la contrainte référentielle, mais modifier le trigger qui lui est associé.

    Supposons que vous ayez codé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Create Table Client 
    (    Matricule     Integer ...
     ...
       , Constraint C1 Primary Key (Matricule) ...
    )  ;
     
    Create Table Commande
    (    CommandeId    Integer ...
       , Matricule     Integer ...
     ...
       , Constraint C2 Primary Key (CommandeId) ...
       , Constraint C3 Foreign Key (Matricule) References Client
     ...
    )  ;
    En l’état, la contrainte C3 interdit la modification de la clé primaire de la table Client s’il existe une commande faisant référence au client associé.
    Pour propager la modification dans la table Commande, il faut modifier la contrainte C3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Constraint C3 Foreign Key (Matricule) References Client
       On Update Cascade
    Étant sous-entendu que votre SGBD permette de le coder.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  5. #5
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    Si le SGBD ne permet pas la modification des clés en cascade, il faut trouver une alternative (cas par exemple de DB2 et d'Oracle).

    Pour reprendre mon exemple, on peut supprimer la contrainte C3 et garantir l’intégrité référentielle par un trigger, mais attention à bien prendre en compte tous les cas de figure qui peuvent se présenter :

    Rattachement d’une commande à un client existant, changement de rattachement, suppression d’un client, remplacement de la valeur de la clé primaire du client (le cas qui vous préoccupe...)

    Sinon, vous pouvez procéder ainsi :

    Soit C1 le client dont on veut modifier le matricule valant "m1" et devant prendre la valeur "m2" :

    Insert d’un client C2 identique à C1, mais avec le matricule "m2".
    Update des commandes de C1, en y remplaçant "m1 par "m2".
    Delete du client C1.

    Évidemment, si cela se produit souvent, c’est un peu lourd...

    Moralité : éviter de prendre comme clé primaire un attribut susceptible de varier dans le temps. A l’avenir, pour la clé primaire, définissez un attribut ad-hoc, invariant et ravalez Matricule au rang de clé alternative.

    => Autrement dit, vous avez une autre solution :

    Ajouter à la table Client une colonne invariante ClientId.
    Vous recopiez dans cette colonne la colonne Matricule : à cet instant, les deux colonnes font double emploi.
    Ensuite :

    Alter Table Commande : DROP de la contrainte FOREIGN KEY actuelle (Matricule)
    Alter Table Commande : renommer la colonne Matricule en ClientId (c’est facultatif, mais plus propre).
    Alter Table Client : DROP de la contrainte PRIMARY KEY (Matricule)
    Alter Table Client : ADD d’une nouvelle contrainte UNIQUE (Matricule)
    Alter Table Client : ADD de la contrainte PRIMARY KEY (ClientId)
    Alter Table Commande : ADD de la contrainte FOREIGN KEY nouvelle (ClientId).

    Les valeurs de la colonne ClientId de la table Commande sont valides, puisque pour le moment les colonnes Matricule et ClientId de la table Client font double emploi.

    Sous réserve que je n’ai rien oublié (je ne traite pas par exemple des index et autres concepts physiques), à partir de maintenant on peut modifier un matricule, mais sous réserve bien sûr de ne pas modifier ClientId qui par définition est invariant (et du reste n’a pas à être montré à l’utilisateur, qui ne voit que Matricule). Désormais, les deux colonnes ClientId et Matricule ne font plus double emploi.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 99
    Points : 59
    Points
    59
    Par défaut
    ok, je vais essayer mais c'est compliqué Merci beaucoup.

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

Discussions similaires

  1. Modification d'une clé primaire
    Par Adil BE dans le forum SQL
    Réponses: 5
    Dernier message: 25/02/2009, 16h11
  2. Modification d'une clé primaire
    Par mehdiyou dans le forum SQL
    Réponses: 3
    Dernier message: 14/04/2008, 17h26
  3. Probleme hibernate modification d'une clé primaire
    Par mrjeronimo dans le forum Hibernate
    Réponses: 3
    Dernier message: 24/03/2008, 17h33
  4. Modification d'une cle primaire chaine de charactere
    Par Contrec dans le forum Oracle
    Réponses: 7
    Dernier message: 01/08/2007, 08h15
  5. [Oracle] modification d'une clé primaire composée
    Par petburn dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/03/2006, 15h58

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