PostgreSQLLa base de données la plus sophistiquée au monde.

5.5. Modification des tables

Quand on crée une table et qu'on se rend compte qu'on a fait une erreur ou que les besoins de l'application ont changés, on peut alors effacer la table et la recréer. Mais ceci n'est pas pratique si la table contient déjà des données ou si la table est référencée par d'autres objets de la base de données (une contrainte de clé étrangère). Par conséquent, PostgreSQL™ offre une série de commandes permettant de modifier une table existante. Notez que ceci est différent au niveau du concept avec la modification des données contenues dans la table ; ici, nous sommes intéressés par la modification de la définition ou de la structure de la table.

Vous pouvez

  • ajouter des colonnes,

  • retirer des colonnes,

  • ajouter des contraintes,

  • retirer des contraintes,

  • modifier les valeurs par défaut,

  • modifier les types de données des colonnes,

  • renommer des colonnes,

  • renommer des tables.

Toutes ces actions sont réalisées en utilisant la commande ALTER TABLE.

5.5.1. Ajouter une colonne

Pour ajouter une colonne, utilisez une commande comme ceci :

ALTER TABLE produits ADD COLUMN description text;

La nouvelle colonne est initialement remplie avec la valeur par défaut (NULL si vous n'avez pas spécifié de clause DEFAULT).

Vous pouvez aussi définir des contraintes sur la colonne au même moment en utilisant la syntaxe habituelle :

ALTER TABLE produits ADD COLUMN description text CHECK (description <> '');

En fait, toutes les options applicables à la description d'une colonne dans CREATE TABLE peuvent être utilisées ici. Néanmoins, gardez en tête que la valeur par défaut doit satisfaire les contraintes données. Sinon, ADD échouera. Autrement, vous pouvez ajouter les contraintes plus tard (voir ci-dessous) après avoir rempli la nouvelle colonne correctement.

5.5.2. Retirer une colonne

Pour retirer une colonne, utilisez une commande comme celle-ci :

ALTER TABLE produits DROP COLUMN description;

Les données de cette colonne disparaissent. Les contraintes de table impliquant la colonne sont aussi supprimées. Néanmoins, si la colonne est référencée par une contrainte de clé étrangère dans une autre table, PostgreSQL™ ne supprimera pas silencieusement cette contrainte. Vous pouvez autoriser la suppression de tout ce qui dépend de la colonne en ajoutant CASCADE :

ALTER TABLE produits DROP COLUMN description CASCADE;

Voir la Section 5.11, « Gestion des dépendances » pour une description du mécanisme général derrière ceci.

5.5.3. Ajouter une contrainte

Pour ajouter une contrainte, la syntaxe de contrainte de table est utilisée. Par exemple :

ALTER TABLE produits ADD CHECK (nom <> '');
ALTER TABLE produits ADD CONSTRAINT autre_nom UNIQUE (no_produit);
ALTER TABLE produits ADD FOREIGN KEY (id_groupe_produit) REFERENCES groupes_produits;

Pour ajouter une contrainte non NULL, qui ne peut pas être écrite sous forme d'une contrainte de table, utilisez cette syntaxe :

ALTER TABLE produits ALTER COLUMN no_produit SET NOT NULL;

La contrainte sera vérifiée immédiatement, donc les données de la table doivent satisfaire la contrainte avant qu'elle soit ajoutée.

5.5.4. Retirer une contrainte

Pour retirer la contrainte, il faut connaître son nom. Si vous lui avez donné un nom, alors c'est facile. Sinon, le système a attribué un nom généré que vous devez découvrir. La commande \d table de psql peut être utile ici ; d'autres interfaces peuvent aussi donner le moyen d'examiner les détails de table. La commande est :

ALTER TABLE produits DROP CONSTRAINT autre_nom;

(si vous traitez avec un nom de contrainte généré comme $2, n'oubliez pas qu'il faudra l'entourer de guillemets double pour en faire un identifieur valable)

Comme avec la suppression d'une colonne, vous avez besoin d'ajouter CASCADE si vous voulez supprimer une contrainte qui dépend d'autre chose. Un exemple concerne la contrainte de clé étrangère qui dépend d'une contrainte de clé unique ou primaire sur le(s) colonne(s) référencée(s).

Ça fonctionne de la même manière pour toutes les types de contrainte sauf les contraintes non NULL. Pour retirer une contrainte non NULL, utilisez

ALTER TABLE produits ALTER COLUMN no_produit DROP NOT NULL;

(Rappelez vous que les contraintes non NULL n'ont pas de noms.)

5.5.5. Modifier la valeur par défaut d'une colonne

Pour mettre une nouvelle valeur par défaut sur une colonne, utilisez une commande comme celle-ci :

ALTER TABLE produits ALTER COLUMN prix SET DEFAULT 7.77;

Notez que ceci n'affecte pas les lignes existantes dans la table, cela ne modifie que la valeur par défaut pour les futures commandes INSERT.

Pour retirer toute valeur par défaut, utilisez

ALTER TABLE produits ALTER COLUMN prix DROP DEFAULT;

Ceci est équivalent à mettre la valeur par défaut à NULL. En conséquence, ce n'est pas une erreur de retirer une valeur par défaut qui n'a pas été définie car la valeur NULL est la valeur par défaut implicite.

5.5.6. Modifier le type de données d'une colonne

Pour convertir une colonne en un autre type de données, utilisez une commande comme ceci :

ALTER TABLE produits ALTER COLUMN prix TYPE numeric(10,2);

Elle ne réussira que si chaque valeur dans la colonne peut être convertie dans le nouveau type par une conversion implicite. Si une conversion plus complexe est nécessaire, vous pouvez ajouter une clause USING qui spécifie comment calculer les nouveaux valeurs à partir des anciennes.

PostgreSQL™ tentera de convertir la valeur par défaut de la colonne, si elle en a une. Mais ces conversions pourraient échouer ou pourraient produire des résultats surprenants. Il est souvent mieux de supprimer les contraintes sur une colonne avant de modifier son type, puis d'ajouter les contraintes modifiées convenablement.

5.5.7. Renommer une colonne

Pour renommer une colonne :

ALTER TABLE produits RENAME COLUMN no_produit TO numero_produit;

5.5.8. Renommer une table

Pour renommer une table :

ALTER TABLE produits RENAME TO elements;