En SQL, le concept de clés étrangères est un concept important que l’on retrouve dans toutes les bases de données professionnelles utilisées dans l’industrie. L’idée de base est d’empêcher votre base de données PostgreSQL de stocker des données incohérentes en appliquant des contraintes garantissant l’exactitude de vos tables (au moins en ce qui concerne les relations entre objets). L’intégrité référentielle est donc l’un des concepts les plus importants jamais inventés.

Cependant, les clés étrangères introduiront certains problèmes dont vous devrez vous occuper lors de l’écriture d’applications. S’il n’y a pas de clés étrangères, vous pouvez insérer des données dans n’importe quelle table dans n’importe quel ordre. PostgreSQL s’en fiche. Cependant, si une clé étrangère est en place, l’ordre commence à avoir de l’importance (au moins dans un scénario typique, mais plus à ce sujet plus tard).

Clés étrangères et commande

Pour montrer l’importance de la commande, nous devons d’abord créer un modèle de données:

Nous voulons stocker les devises, les produits ainsi que les descriptions de produits. Fondamentalement, il s’agit d’un modèle de données très simple. Voyons s’il nous arrive d’insérer dans la table des produits:

Logiquement, la première INSERTION va échouer car la devise numéro 1 n’existe pas encore. Si nous voulons INSÉRER, nous devons utiliser une valeur NULL (= devise inconnue). Dans l’ordre des mots: Nous devons d’abord remplir la table des devises, puis insérer des emplacements, etc. L’ordre importe dans le cas par défaut.

Déterminer l’ordre d’insertion correct pour les clés étrangères

Si vous devez commencer à utiliser un modèle de données existant, il peut être un peu difficile de contourner ce problème. Remplir un modèle de données vide peut être un peu délicat. Alors pourquoi ne pas écrire une requête nous indiquant l’ordre dans lequel nous sommes censés insérer des données?

Eh bien, voici cette requête magique

La requête n’est pas triviale à lire, mais j’ai fait de mon mieux pour la documenter un peu. Fondamentalement, les tables système PostgreSQL contiennent toutes les informations dont nous avons besoin pour déterminer le bon ordre. Voici la sortie:

 table_name | level-----------------+------- t_currency | 1 t_location | 1 t_product | 2 t_product_desc | 3 t_product_stock | 3(5 rows)

Comme vous pouvez le voir, la requête nous a correctement donné les tables dans l’ordre souhaité. Tout d’abord, nous devons insérer dans toutes les tables au niveau un et ainsi de suite. Si nous nous en tenons à cet ordre, l’intégrité référentielle sera toujours assurée (en supposant que les données sont correctes).

Utilisant des contraintes « initialement différées »

Dans certains cas, l’ordre d’insertion peut être une mauvaise chose à gérer. Et si nous avions les moyens de dire à PostgreSQL d’ignorer l’ordre et de vérifier l’intégrité lors de la validation à la place ? C’est exactement ce que fait « initialement différé ». Voici comment cela fonctionne:

Dans ce cas, nous pouvons modifier les données dans l’ordre que nous voulons. Tant que l’intégrité est garantie intacte à la fin de la transaction, PostgreSQL est parfaitement correct. PostgreSQL reportera la vérification des contraintes et soulagera le développeur.

Enfin

Si vous voulez en savoir plus sur SQL avancé, vous voudrez peut-être jeter un œil à mon blog sur certaines fonctions de fenêtrage plus avancées (avec des liens). Alors mettez votre cravate et lisez pour en savoir plus.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.