mercredi 18 décembre 2024

Contraintes d'intégrité référentielle

 Considérons cet écran libreoffice:


Les données qui sont affichées proviennent de deux tables: la table 'employés' dont la colonne 'service' fait référence à la clef primaire 'service_id' d'une autre table, la table 'services'.
Le contenu de 'service' doit nécessairement être une valeur de la clef primaire 'service_id'. C'est l'intégrité référentielle. 'service' est une clef étrangère (foreign key).
Si les tables sont dans une base de données Postgresql, cette intégrité référentielle peut être garantie par une contrainte.
Par exemple si je tente de remplacer le service 06 de l'employés 1011 par le service 07 (qui n'existe pas) j'obtiens:


Mais on pourrait arriver au même résultat en se basant uniquement sur libreoffice. Ici le nom du service est affiché mais pas son code (06):


Et l'utilisation du menu déroulant me permet uniquement de remplacer le service du matricule 1011 par un  service existant:


Mais que se passe-t-il si je touche à la table 'services' ? Cette fois l'existence de la contrainte postgresql est essentielle pour assurer l'intégrité référentielle.
Si je tente de supprimer la rangée de clef 03 de la table 'services' je reçois ce message:


La suppression n'a pas lieu. Cependant si je regarde de plus près cette contrainte (employés_services_fkey) à l'aide de pgAdmin4, je constate que d'autres possibilité existent:




En cas de suppression (On delete) les actions le plus courantes sont:

SET NULL:
Pour tous les employés dont le code service est 03, ce code service est mis à NULL, si c'est permis.
NULL, ce n'est pas des espaces pour du texte, ni zéro pour un nombre.

CASCADE:
Tous les employés du service 03 sont supprimés

SET DEFAULT:
Si le code service d'un employé est 03, il est remplacé par sa valeur par défaut, si celle-ci existe et s'il lui correspond une rangée de la table 'services'.
Par exemple, cette valeur par défaut pourrait être 99, mais il faudrait aussi dans la table 'services' une rangée 99.

En cas d'update:

CASCADE
Le code service de tous les employés concernés est modifié