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.