04/10/2023

1. Colonnes générées

Lu 413 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)
);
SQL

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');
SQL

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

SELECT * FROM facture;
SQL

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.