5.6. 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 distinct 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

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

5.6.1. Ajouter une colonne

Pour ajouter une colonne, utilisez une commande comme ceci :

ALTER TABLE products 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 products 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.6.2. Retirer une Colonne

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

ALTER TABLE products 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 products DROP COLUMN description CASCADE;

Voir Section 5.10 pour une description du mécanisme général derrière ceci.

5.6.3. Ajouter une Contrainte

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

ALTER TABLE products ADD CHECK (name <> '');
ALTER TABLE products ADD CONSTRAINT some_name UNIQUE (product_no);
ALTER TABLE products ADD FOREIGN KEY (product_group_id) REFERENCES product_groups;

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

ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;

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

5.6.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 tablename de psql peut être utile ici; d'autres interfaces peuvent aussi donner le moyen d'examiner les détails de table. Alors, la commande est:

ALTER TABLE products DROP CONSTRAINT some_name;

(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 identifiant 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 products ALTER COLUMN product_no DROP NOT NULL;

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

5.6.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 products ALTER COLUMN price 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 products ALTER COLUMN price 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.6.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 products ALTER COLUMN price TYPE numeric(10,2);
    

Elle ne réussira seulement si chaque entrée 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.6.7. Renommer une colonne

Pour renommer une colonne:

ALTER TABLE products RENAME COLUMN product_no TO product_number;

5.6.8. Renommer une Table

Pour renommer une table:

ALTER TABLE products RENAME TO items;