Leçon 13 : La clé primaire (L'identifiant)

Pour suivre cette leçon, vous devez avoir suivi les leçons précédentes. Ou plus précisément, vous devez être en possession de la base de données procd.mdb telle qu'elle était à la fin de la leçon précédente. Si vous n'êtes pas certain de l'avoir, vous pouvez la télécharger ici

Résumé de la leçon précédente

Nous avons vu la dernière fois comment faire pour traiter les tables de manière générale : Les copier, les effacer, les renommer. Nous avons vu qu'il est possible de voir les dates de création et de modification de ces tables. Nous avons enfin constaté que la sauvegarde régulière et fiable de la base de données complète est très importante, même si ACcess n'est pas pourvu d'un outil de sauvegarde complète de la base de données.

Aperçu de cette leçon

Dans cette leçon, nous allons parler de la clé primaire : Pourquoi, comment ? En fait, le terme "Clé primaire" a été traduit de l'anglais littéralement (Primary Key). En réalité, la traduction la plus correcte en français serait Identifiant.

Il y a une chose qui me tracasse : A partir d'un certain nombre de clients, j'ai peur d'entrer par erreur une 2ème fois un client qui existe déjà...

Essayons : Ouvrez la table T_Client en mode Saisie de données, et entrez, exprès, 2 fois le même client : Amélie Miresmo : . Evidemment c'est une erreur évidente parce que nous les avons entrées juste l'une en dessous de l'autre... Mais si elles sont séparées de 1000 clients... c'est plus délicat ! Comment empêcher ça ?

Revenez dans la table en mode création, et cliquez sur NomClient¨, puis cliquez sur la petite clé : . ça donne pour résultat d'afficher cette petite clé à gauche du champ : On dit alors en termes techniques que "Le champ NomClient est défini en Clé Primaire" - ou que "NomClient est l'Identifiant de la table T_Client". ça veut simplement dire qu'il va être à présent STRICTEMENT IMPOSSIBLE d'avoir 2 fois le même nom de client ! Eh oui... Maiiiiiiiis... C'est ce que nous venons de faire ! Et exprès en plus ! Nous avons installé deux Amélie Miresmo, et ensuite nous définissons le champ NomClient en Clé Primaire ! On ne manque pas de toupet !!!

Que va dire Access ? Eh bien il ne va pas du tout être d'accord ! Essayez : Cliquez sur pour aller en mode saisie de données. Comem d'habitude, Access va vous prévenir que la table "Doit être sauvegardée"... Répondez oui (Pas le choix), et c'est maintenant qu'il n'est pas d'accord : . Cliquez sur OK, vous aurez ce 2ème message d'erreur : . (Ca veut dire qu'il ne veut rien savoir :Votre clé primaire, il n'en veut pas !) Cliquez sur OK.

Tiens ! "Ne peut contenir une valeur Null" ! Qu'est-ce que ce message a à voir avec le fait que nous avons deux Amélie Miresmo ???

Eh bien, la clé primaire, en plus de ne pas accepter les Doublons (2 fois le même nom de client), elle n'accepte non plus pas qu'un client n'ait pas de nom ! Si vous avez cent mille client, et qu'UN SEUL n'a pas de nom, alors, il sera IMPOSSIBLE de définir une clé primaire sur ce champ !

Mais comment je fais alors ??? Si Access m'empêche d'aller en mode saisie de données pour mettre des noms à tout le monde, je suis bloqué !

Non. Pas tant que ça. Voici comment vous allez faire :

  1. Vous allez enlever la clé primaire de NomClient : C'est à dire que vous allez cliquer sur NomClient, et RE-cliquer sur la petite clé . ça l'enlèvera. Quand on clique sur cette petite clé , une fois ça la met, une autre fois ça l'enlève.
  2. Lancez la table en mode saisie de données (Vous pouvez maintenant que vous avez retiré la clé)
  3. Mettez un prénom à Juliette :
  4. Supprimez Colushe et Roméo (Cliquez bien ici , et appuyez sur Delete)

Votre table ne devrait maintenant plus contenir QUE des enregistrements qui contiennent CHACUN un nom ET un prénom. : , à part bien sûr la dernière ligne qui est complètement vide, mais c'est parce que ce n'est pas un enregistrement, c'est une nouvelle ligne pour pouvoir justement entrer un nouvel enregistrement. Celle ligne ne peut pas s'effacer évidemment.

Je remet la clé primaire sur le nom, maintenant ?

Oui. Vous revenez en mode création, et vous remettez la clé primaire sur le nom. Relancez ensuite encore une fois la table en mode saisie de données. Access va donc encore vous prévenir qu'il doit sauvegarder la table. Dites oui, et cette fois, c'est ce message d'erreur que vous obtenez : .

Eh oui : N'oubliez pas qu'à la base, nous avons voulu définir une clé primaire sur NomClient pour empêcher les doublons ! Ce message est plus explicite : "Risque de doublons dans champs Index, clé principale ou relation interdisant les doublons"... En gros, tant que vous avez deux personnes qui s'appellent Miresmo (même si elles ont des prénoms différents), la clé primaire (Clé principale - identifiant : Ce sont des synonymes) ne sera PAS applicable !

Que fait-on alors ?

Vous devriez voir venir l'astuce :

  1. On enlève la clé primaire de NomClient
  2. On lance la table en mode saisie de données
  3. On supprime la 2ème Amélie Miresmo
  4. On revient en mode création
  5. On remet la clé primaire sur NomClient
  6. On relance la table en mode saisie de données
  7. On dit "Oui" quand Access nous informe que la table doit être enregistrée
    SUSPENSE...
  8. OUI ! ça marche ! Vous êtes dans votre table en mode saisie de données AVEC la clé primaire sur NomClient !!!

Allez-y, faites-le si ce n'est pas déjà fait !

C'est bizarre, il a changé l'ordre de mes clients...

Disons que plus exactement, il les a rangé par ordre alphabétique

Et si je voulais les retrouver dans l'orde dans lequel je les ai rentrés ?

Ici, c'est fichu. On ne peut plus. Mais, entre nous, est-ce vraiment important ?

Non pas vraiment en fait. Et maintenant, si on essaie d'entrer une 2ème fois Amélie Miresmo ?

Access va refuser. Essayez : . Il accepte, c'est vrai... Mais il n'a pas encore sauvegardé : Souvenez vous du petit crayon (). Dès que vous allez sauvegarder - par exemple en descendant d'un enregistrement - alors, vous aurez instntanément ce message d'erreur :

Cliquez sur OK, et vous revenez à cet état : Access va vous laisser affiché la 2ème Amélie Miresmo, mais il va refuser de sauvegarder. Vous ne pouvez plus rien faire : Vous êtes totalement bloqué. Vous ne pouvez même plus revenir en mode création.

Oui, c'est vrai... Qu'est-ce que je peux faire ?

Appuyez sur ESC . Ca fera disparaître votre 2ème client.

Ah d'accord. Et si par exemple, j'entrais une autre Miresmo : Par exemple Claudine Miresmo, ça ne marcherais pas ?

Non, parce que vous avez défini le champ NomClient comme étant la clé primaire. Essayez, vous verrez : Vous ne pourrez pas la sauvegarder.

Ah oui mais ça ne va pas, ça ! Et si j'ai VRAIMENT une Claudine Miresmo ? .. Ah ben j'ai trouvé : J'écris la 2ème Miresmo avec un point à la fin de Miresmo : "Miresmo.", comme ça Access va voir que ce sont 2 noms différents

Non. C'est nul de faire comme ça. Et si vous avez par exemple 10 clients avec le même nom de famille, vous allez commencer à faire des fautes d'orthographe exprès alors ?

Donc, si je comprend bien, soit je ne met pas de clé primaire, et je prend le risque de placer par erreur plusieurs fois le même client, ou soit j'en met une, et je ne pourrai jamais avoir deux clients avec le même nom ?

Oui... MAIS... Il y a une combine : C'est la clé primaire composée : C'est à dire qu'il est possible de placer une clé primaire sur plusieurs champs en même temps. Ici, par exemple, on pourrait placer une clé primaire sur le nom ET le prénom. Alors, dans ce cas, on pourra avoir plusieurs clients avec le même nom, plusieurs clients avec le même prénom, mais on ne pourra PAS avoir 2 fois un client avec le même nom et le même prénom !

Comment faire ? ALlez en mode création, et sélectionnez en cliquant dans la partie de gauche les DEUX champs NomClient ET Prenom. Une fois qu'ils sont sélectionnés (en noir), vous cliquez sur la petite clé. Vous aurez ce résultat :

Voilà. A partir de maintenant, vous allez pouvoir avoir plusieurs noms et prénoms les mêmes, mais pas ensemble. Par exemple, vous allez pouvoir mettre : (Plusieurs fois Martin avec des prénoms différents, et plusieurs fois Michel avec des Noms différents). Par contre un 2ème Michel Piccolo sera impossible (Même nom ET même prénom)

D'accord. Mais je suis en train de penser que si on a vraiment beaucoup de clients, il est bien possible d'avoir 2 clients distincts avec le même nom et le même prénom... Je peux supposer qu'il y a pas mal de Jean Dupont par exemple...

Et bien vous enlevez la clé primaire et voilà tout...

Mouais... Ou alors on combine carrément 3 champs : Le nom, le prénom ET la date de naissance... Comme ça on est tranquille. On peut faire ça ?

Oui, oui. Comme ça vous pourrez avoir plusieurs clients qui ont le même nom ET le même prénom, mais alors, ils ne pourront pas avoir la même date de naissance. Et si jamais le cas se présente : Incroyable : Vous avez 2 clients né le même jour, et qui ont le même nom ET le même prénom !

Là, vous tirez les choses par les cheveux... Est-ce vraiment possible ?

Disons qu'il y a vraiment peu de chance que ça se produise. Mais on peut essayer quand même de simplifier. Plustôt que de faire une clé primaire combinée, qui est quand même un peu compliqué, n'y aurait-il pas un champ qui pourrait servir de clé primaire à lui tout seul ?

Je réfléchis... Le salaire ... Non, la date de naissance... Non.. Hmmm... Ah ! Oui : bien sûr : Le numéro de téléphone ! Il ne peut PAS y en avoir 2 les mêmes !

Non, c'est vrai, mais imaginez par exemple que vous avez 2 clients : Ce sont 2 frères qui habitent dans le même appartement : Ils ont donc le même numéro de téléphone, et pourtant ce sont 2 clients distincts...

Vous avez raison. Ou alors.. Le numéro AVS ? C'est comme me numéro de sécurité sociale : ça, c'est unique !

Là, d'accord. Mais comment allez-vous faire si vous devez entrer dans votre base un client qui ne vous a pas encore communiqué son numéro AVS ? Vous allez l'écrire sur un Post-il collé à l'écran en attendant d'avoir son numéro à disposition ? Ou alors vous allez mettre un faux numéro AVS exprès pour pouvoir entrer le client ? Pas terrible ! ...

Donc ?

Donc, dans notre cas, nous constatons que ce n'est pas si simple de mettre une clé primaire sur cette table. ALors, nous allons faire ce que toutes les entreprises du monde font : Nous allons assigner un numéro d'identification unique à chacun de nos clients : Ce sera un numéro tout droit sorti de notre imagination.

Dans votre table T_Client, ajoutez un nouveau champ que vous appellerez IDClient (comme IDentification Client), définissez-le en clé primaire , et lancez la table en mode saisie de données.

Je l'ai fait mais il me donne l'erreur du début :

Oui. Il y a quoi, actuellement dans IDClient

Ben ... Rien !

Ben voilà... Et comme une clé primaire DOIT contenir quelque chose et EN PLUS quelque chose de différent pour chaque enregistrement... Voilà la source de l'erreur. Il vous reste à :

  1. Enlever la clé primaire
  2. Lancer la table en mode saisie de données
  3. Ecrire quelque chose de différent pour chaque client : (Vous n'êtes pas obligé de recopier scrupuleusement les IDClient, vous mettez n'importe quoi pourvu qu'il n'y ait pas 2 fois le même numéro)
  4. Revenir en mode création
  5. Définir IDClient comme clé primaire
  6. Relancer la table en mode saisie de données : Il devrait cette fois se laisser faire.

Oui. Ca marche. On ne peut pas demander à Access de numéroter automatiquement lui-même les clients ?

Si. C'est d'ailleurs la possibilité la plus intéressante. Pour ce faire, vous revenez en mode création, et vous définissez IDClient comme NuméroAuto : . Malheureusement, quand vous faites ça comme ça, vous obtenez ce message d'erreur :

Ca veut dire que comme vous avez déjà rentré des données dans IDClient, Access se rend compte qu'il va devoir effacer vos données pour les remplacer par une numérotation automatique. Afin de vous obliger à en prendre bien conscience, il vous demande de bien vouloir effacer le champ IDClient, et de le recréer juste après. C'est ce que vous allez faire : Effacez IDClient (Cliquez à gauche de IDClient , et appuyez sur DELETE ). Ensuite, recréez une ligne vide au-dessus de NomClient (Cette fois je vous laisse vous rappeler comment on fait), et remettez IDClient : Définissez le immédiatement en NuméroAuto . Définissez-le également en Clé primaire, et lancez la table en mode saisie de données. Si tout s'est bien passé, vous devriez obtenir ceci : .

Pourquoi met-il (NuméroAuto) sur le dernier enregistrement ?

Ce n'est pas le dernier enregistrement. C'est un nouvel enregistrement. Dès que vous allez essayer d'entrer un nouveau client, immédiatement, il sera numéroté 14, et un nouvel enregistrement (NuméroAuto) se tiendra déjà prêt pour le suivant. Essayez : Vous voyez ? Il suffit d'une lettre. Complétez le nom et le prénom : .

Combien puis-je mettre d'enregistrements de cette façon ?

Pas mal. Si mes souvenirs sont exacts, au moins seize millions. Ceci dit, votre PC sera à genoux avant que vous n'arriviez aux limites du nombre d'enregistrements...

Qu'est-ce qui se passe si je supprime un enregistrement ? Il renumérote tous les autres ?

Non. Nous allons essayer : effacez Catherine Deneuves : . Vocii le résultat : Le numéro 6 est définitivement perdu ! Il n'y a aucun moyen de le récupérer.

Pourquoi est-ce qu'il ne renumérote pas tous les clients ?

Parce que s'il faisait ça, les clients changeraient de numéro 10 fois par jour ! ça n'aurait plus aucune utilité... Vous, vous avez bien un numéro de client par exemple chez votre plombier, ou même chez votre médecin... Ce serait invivable si votre numéroi de client changeait pour un oui ou pour un non.

Même si on recrée Catherine Deneuves comme nouveau client, elle ne reprend pas non numéro ?

Evidemment non. Essayons : . C'est maintenant le numéro 15... Attention donc : Vous êtes en possessions de 14 enregistrements, mais ils sont numérotés jusqu'à 15... Eh oui ! Il y a un trou :

Ok ! Mais alors, je suis en train de penser : Puisque c'est Access qui gère cette numérotation automatique, on n'a pas besoin de définir cet IDClient en clé primaire ?

Et bien si. Disons que le NuméroAuto est très très copain avec la clé primaire. Si vous ne définissez pas IDClient (NuméroAuto) en clé primaire, nous aurons des problèmes bien plus tard lorsque nous allons lier cette table avec d'autres tables, mais c'est vrai que c'est de la musique d'avenir.

Bon, à la base, on voulait éviter d'avoir des doublons dans les clients, et finalement, nous avons tellement discuté que nous pouvons à nouveau avoir plein de doublons dans les noms des clients par erreur - mis à part que maintenant ils sont numérotés ?

Eh oui... Bienvenue dans le monde des bases de données... C'est un problème inhérent à la nature même des bases de données... Vous avez vu et constaté par vous-même que c'est vraiment difficile à gérer

On ne peut vraiment rien faire pour empêcher les doublons finalement ?

Si. Il existe un genre de requête qui s'appelle "Requête Trouver les doublons" qui va nous aider à repérer les clients entrés par erreur à double, et à les comparer avec des clients qui sont bien différents, mais qui ont le même nom, et/ou le même prénom par exemple, mais c'est l'objet d'un prochain chapitre.

A la limite, on ne met pas de clé primaire du tout, et puis voilà...?

Non, ce n'est pas génial de ne pas en mettre. Imaginez une base de données beaucoup plus complexe que ça (des milliers de clients, des commandes, des factures, etc...): Vous avez un certain José Lopez qui vous appelle en vous demandant ou en est sa commande. Vous recherchez dans votre table José Lopez. Vous le trouvez, et vous constatez qu'il a commandé 2 fois, livré dans les temps, mais qu'il n'a jamais payé, et qu'il est maintenant en poursuite. Voius allez lui expliquer que comme c'est un mauvais payeur, vous refusez dorénavant de le livrer ! Or... Il se trouve que dans votre base de données, vous avez DEUX José Lopez... Bien distincts... Et celui qui vous appelle est, au contraire, un de vos meilleurs clients... Très bon payeur de surcroit ! ALors là, c'est LA gaffe ! Si vous lui aviez attribué un numéro de client, vous lui auriez demandé, en plus de son nom et prénom, son numéro de client (qu'il doit connaître évidemment - mais c'est facile : Sur chaque facture, le numéro de client est reporté), ce qui vous aurait permis de constater que vous n'étiez pas sur le bon José Lopez, et ainsi éviter la catastrophe commerciale.

Il y a une autre bonne raison, cette fois technique, pour mettre un numéro de client, mais nous verrons celà bien plus tard.

Finalement, on met systématiquement un NuméroAuto pour chaque table?

Ah non, justement... Ici oui, parce que nous n'avons pas le choix : Il peut y avoir des clients avec le même nom, mais dans certaines tables, il n'est PAS POSSIBLE d'avoir 2 fois la même chose, nous verrons celà ultérieurement.

Apparté :

Access aime bien les clés primaires. Il fait même croire qu'il est impensable d'avoir une table sans clé primaire. Aussi, il se propose, par excès de zèle, de vous créer une clé primaire quasiment contre votre gré. Faisons un test :

  1. Créez une nouvelle table. Installez y deux champs : NomAmi, et Prenom (Laissez-les en texte, et ne mettez pas de clé primaire).
  2. lancez-là en mode saisie de données
  3. Access vous informe que la table doit être enregistrée : Dites Oui. Donnez comme nom : T_Ami
  4. Vous avez alors cette boîte de dialogue :
    En gros, il dit : "Une clé primaire, c'est vaaaaachement bien ! Quoi ??? Vos n'allez quand même pas me dire que vous ne voulez pas de clé primaire !!! Vous êtes nul !!! Bon, je ne peux pas vous obliger, mais quand même, je vous la conseille fortement"
  5. Il faudra à l'avenir TOUJOURS TOUJOURS répondre non à cette question. Si vous répondez oui, voilà ce qu'il va faire : . Il va vous ajouter un champ N° qu'il va définir lui-même en NuméroAuto, ET en clé primaire : . Essayez, vous verrez.

Voilà... Résultat, il ne vous reste plus qu'à effacer ce champ. Ne laissez pas Access "Penser à votre place". Tandis que si vous aviez répondu non à cette question , il aurait simplement enregistré la table telle quelle, et vous auriez travaillé dedans sans autre forme de procès...

Bon... Hem... On peut résumer ?

La clé primaire est un attribut de champ. On dit que tel ou tel champ est la clé primaire de la table dans laquelle il est. N'importe quel champ peut faire office de clé primaire pour autant qu'il ne soit pas répété. Dans l'exemple des clients, on ne peut pas vraiment mettre la clé primaire sur le nom du client, parce qu'il peut y avoir plusieurs clients distincts avec le même nom.
Une clé primaire composée est une clé primaire que l'on pose sur 2 ou plusieurs champs à la fois. Ceci permet d'avoir plusieurs clients qui onbt le même nom, mais ils doivent avoir un prénom différent (dans le cas ou la clé est posée sur le nom et le prénom).
Comme dans l'absolu, il est possible d'avoir 2 ou plusieurs clients qui sont homonymes par le nom et le prénom, on décide alors d'attribuer un numéro automatique (NuméroAuto) à un nouveau champ que l'on pourrait appeler IDClient.
Le NuméroAuto est tout à fait bon copain avec la Clé Primaire - Un champ NuméroAuto est de manière presque systématique la clé primaire d'une table.

Avez-vous bien compris ?

  1. Une clé primaire est synonyme d'identifiant ?
    a. Oui ***
    b. Non

  2. Il est possible d'avoir une table sans clé primaire ?
    a. Oui ***
    b. Non

  3. Quand on regarde le dernier enregistrement d'une table pourvue d'un champ en NuméroAuto, ce dernier enregistrement donne aussi le nombre d'enregistrements de la table ?
    a. Oui
    b. Non ***

  4. J'ai une table T_Client, avec une clé primaire composée sur NomClient et Prenom. J'ai déjà Jacques Dupont et Paul Durand. Quel enregistrement ne sera pas possible à ajouter ?.
    a. Jacque Dupont
    b. Paul Durant
    c. Paul Durand ***
    d. Jacques Dupont. (A cause du petit . après Dupont, il est possible de le mettre)

  5. Est-il possible de créer une clé primaire sur un champ Mémo ? (Essayez pour avoir la réponse)
    a. Oui
    b. Non ***

  6. J'ai une table qui contient simplement tous les pays du monde (T_Pays): Un seul champ, donc : Pays. J'y insère tous les pays : Allemagne, Belgique, Zimbabwe, etc... comment vais-je définir ma clé primaire ?
    a. Directement sur Pays *** (Oui : Il ne peut PAS y avoir 2 fois le même pays)
    b. Je vais créer IDPays en NuméroAuto pour y mettre la clé primaire
    c. Je ne met pas de clé primaire sur cette table
    d. Je vais créer IDPays en NuméroAuto,
    et je vais faire une clé primaire composée en 2 champs : IDPays et Pays

Pour voir les solutions, il vous suffit de sélectionner le questionnaire ci-dessus : 3 petites étoiles *** apparaîtront en face des bonnes réponses.

Exercice

Créez une base de données Municipalité.mdb. Dans cette base, vous allez créer plusieurs tables :

T_Pompier : Va contenir le nom, le prénom et le numéro de téléphone de chaque pompier du village. En tout, il y a 7 ou 8 pompiers
T_Contribuable : Va contenir le nom, le prénom et l'adresse de chaque contribuable du village (14'500 personnes environ)
T_Rue : Va répertorier le nom de chaque rue de la commune (Il y a 28 rues)
T_Manifestation : Va répertorier les manifestations de la salle des fêtes. Il ne peut y avoir qu'une manifestation par jour, mais il n'y en a pas tous les jours Il faut donc le nom de la manifestation, et la date

L'exercice consiste à créer les tables, et, surtout, à mettre les clés primaires correctement sur chaque table

Téléchargez la solution de l'exercice ici

Si vous n'êtes pas tout à fait certain d'avoir suivi correctement toutes les étapes de cette leçon, vous avez la possibilité de télécharger ici la version de procd.mdb exactement dans l'état ou elle devrait être à la fin de cette leçon.

Aperçu de la leçon suivante

La prochaine leçon sera très amusante ! En effet, vous allez apprendre à créer vous même des listes de choix déroulantes ! Plutôt que d'écrire en toute lettres le pays d'origine de chaque client, avec le risque d'erreur que ça comporte, vous apprendrez comment faire pour le choisir parmi une liste de pays que vous aurez-vous-même défini ! (En réalité, nous ne nous occuperons pas du pays, mais plutôt du champ Titre (Madame, mademoiselle ou monsieur), mais le principe est le même