04/10/2023

1. Colonnes générées

Lu 330 fois Licence Creative Commons

Colonnes générées

Les colonnes générées sont des colonnes dont la valeur est automatiquement calculée à partir des autres colonnes d'une table. On peut les comparer à des vues pour les colonnes.

Voyons par exemple une table de factures qui calculerait automatiquement la date d'échéance, la TVA et le prix TTC:

CREATE SEQUENCE seq_facture_id INCREMENT BY 1 MINVALUE 1 START 1;
CREATE TABLE facture (
    id INT NOT NULL,
    description VARCHAR(255) NOT NULL,
    prix_ht INT NOT NULL,
    tva INT GENERATED ALWAYS AS (prix_ht * 0.2) STORED,
    prix_ttc INT GENERATED ALWAYS AS (prix_ht * 1.2) STORED,
    date_emission DATE NOT NULL,
    date_echeance DATE GENERATED ALWAYS AS (date_emission + INTERVAL '2 months') STORED,
    PRIMARY KEY (id)
);

Il n'est pas nécessaire de spécifier les colonnes générées lors de l'insertion, c'est même impossible:

INSERT INTO facture (id, description, prix_ht, date_emission) VALUES
(nextval('seq_facture_id'), 'Vente matériel', 150, '2022-09-16'),
(nextval('seq_facture_id'), 'Consulting', 460, '2023-02-05'),
(nextval('seq_facture_id'), 'Prestation', 1240, '2023-03-26');

Lors de la lecture de la table, toutes les autres colonnes sont déjà calculés:

SELECT * FROM facture;

Cela ne cause aucun problème de performances car les colonnes générées sont calculées lors de l'écriture (INSERT ou UPDATE) et sont enregistrées, il s'agit de colonnes stockées. PostgreSQL n'implémente pas encore de colonnes virtuelles qui, elles, seraient calculées lors de la lecture.