6
Calculated
medina5 edited this page 2025-09-16 20:39:53 +02:00
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Calcul

Colonnes calculées

Note

Une colonne calculée (ou dérivée) est une colonne dont la valeur nest pas directement saisie par lutilisateur, mais obtenue à partir dune expression basée sur dautres colonnes de la même table.

Colonnes générées

Il est possible de déclarer une colonne comme générée automatiquement et stockée. La valeur est calculée à linsertion ou mise à jour et enregistrée physiquement dans la table.

CREATE TABLE commande (
  id SERIAL PRIMARY KEY,
  prix_unitaire NUMERIC(10,2),
  quantite INTEGER,
  total NUMERIC(10,2) GENERATED ALWAYS AS (prix_unitaire * quantite) STORED
);
  • total est calculé automatiquement.
  • On ne peut pas insérer ou modifier total directement, PostgreSQL sen occupe.
  • La valeur est stockée → plus rapide à lire, mais prend de la place.

Colonnes calculées via de vues

Si lon ne veut pas stocker la valeur (pour éviter la redondance), on peut utiliser une vue.

CREATE VIEW commande_calculee AS
SELECT id,
       prix_unitaire,
       quantite,
       prix_unitaire * quantite AS total
FROM commande;

ci total nest pas stocké → il est recalculé à chaque requête. Moins despace disque, mais peut être plus lent si beaucoup de calculs.

Dans dautres SGBD (MySQL, Oracle), il existe des colonnes générées virtuelles (calculées à la volée sans stockage).

Vérification

Une contrainte CHECK permet dimposer une condition (une règle logique) sur les valeurs dune colonne ou dun ensemble de colonnes.

On peut définir une contrainte CHECK :

au niveau colonne

CREATE TABLE employe (
    id SERIAL PRIMARY KEY,
    nom TEXT NOT NULL,
    age INT CHECK (age >= 18)  -- contrainte sur une seule colonne
);

au niveau table (plusieurs colonnes possibles)

CREATE TABLE commande (
    id SERIAL PRIMARY KEY,
    prix_unitaire NUMERIC(10,2),
    quantite INT,
    CHECK (prix_unitaire >= 0 AND quantite > 0)  -- règle sur plusieurs colonnes
);

Déclencheurs

Un trigger est un mécanisme qui permet dexécuter automatiquement une fonction lorsquun événement se produit sur une table ou une vue.

Cela permet dautomatiser certaines règles métier, de contrôler lintégrité des données ou de maintenir des historiques.

Un trigger repose sur deux éléments :

  1. Une fonction (en PL/pgSQL ou un autre langage supporté) qui contient le code à exécuter.
  2. Le trigger lui-même, qui associe cette fonction à un événement (INSERT, UPDATE, DELETE…).

Volatilité

Note

La volatilité indique au moteur postgreSQL à quel point le résultat de la fonction dépend de létat de la base ou du contexte. Il existe 3 niveaux.

IMMUTABLE

Le résultat ne change jamais pour les mêmes arguments.

Exemple : abs(-5) donne toujours 5, peu importe quand ou où la fonction est exécutée.

Utilisable dans : index, colonnes calculées, contraintes CHECK, etc.

STABLE

Le résultat ne change pas pendant une requête donnée, mais peut changer entre deux requêtes.

La fonction ST_Length(geom) est STABLE car pour une même géométrie, la longueur est toujours la même, MAIS cela dépend de paramètres de la session (SRID de référence).

VOLATILE

Le résultat peut changer même dans une seule requête. Par exemple : random() ou now() donnent des résultats différents à chaque appel.