5.5. Modification des tables
Lorsqu'une table est créée et qu'une erreur a été commise ou que les
besoins de l'application changent, il est alors possible de la
supprimer et de la récréer. Cela n'est toutefois pas pratique si la
table contient déjà des données ou qu'elle est référencée par
d'autres objets de la base de données (une contrainte de clé
étrangère, par exemple). C'est pourquoi PostgreSQL™ offre une série de commandes
permettant de modifier une table existante. Cela n'a rien à voir avec
la modification des données contenues dans la table ; il ne s'agit
ici, que de modifier la définition, ou structure, de la table.
Il est possible
-
d'ajouter des colonnes ;
-
de supprimer des colonnes ;
-
d'ajouter des contraintes ;
-
de supprimer des contraintes ;
-
de modifier des valeurs par défaut ;
-
de modifier les types de données des colonnes ;
-
de renommer des colonnes ;
-
de renommer des tables.
Toutes ces actions sont réalisées à l'aide de la commande ALTER
TABLE, dont la page de référence est bien plus détaillée.
5.5.1. Ajouter une colonne
La commande d'ajout d'une colonne ressemble à celle-ci :
ALTER TABLE produits ADD COLUMN description text;
La nouvelle colonne est initialement remplie avec la valeur par
défaut précisée (NULL en l'absence de clause DEFAULT).
Des contraintes de colonne peuvent être définies dans la même
commande, à l'aide de 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. Il ne faut
toutefois pas oublier que la valeur par défaut doit satisfaire les
contraintes données. Dans le cas contraire, ADD échoue. Il est aussi possible d'ajouter les
contraintes ultérieurement (voir ci-dessous) après avoir rempli la
nouvelle colonne correctement.
Astuce
Ajouter une colonne avec une valeur par défaut nécessite la
mise à jour de chaque ligne de la table pour stocker la valeur
de la nouvelle colonne. Cependant, si aucune valeur par défaut
n'est précisée, PostgreSQL™ peut éviter la mise à
jour physique. Il est, de ce fait, préférable, si la colonne
doit être remplie en majorité avec des valeurs différentes de
la valeur par défaut, d'ajouter la colonne sans valeur par
défaut, d'insérer les bonnes valeurs avec une commande
UPDATE
puis
d'ajouter la valeur par défaut désirée comme décrit ci-dessus.
5.5.2. Retirer une colonne
La commande de suppression d'une colonne ressemble à celle-ci :
ALTER TABLE produits DROP COLUMN description;
Toute donnée dans cette colonne disparaît. Les contraintes de table
impliquant la colonne sont également supprimées. Néanmoins, si la
colonne est référencée par une contrainte de clé étrangère d'une
autre table, PostgreSQL™ ne
supprime pas silencieusement cette contrainte. La suppression de
tout ce qui dépend de la colonne peut être autorisée 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.
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 NOT NULL, qui ne peut pas être écrite
sous forme d'une contrainte de table, la syntaxe suivante est
utilisée :
ALTER TABLE produits ALTER COLUMN no_produit SET NOT NULL;
La contrainte étant immédiatement vérifiée, les données de la table
doivent satisfaire la contrainte avant qu'elle ne soit ajoutée.
5.5.4. Supprimer une contrainte
Pour supprimer une contrainte, il faut connaître son nom. Si elle a
été explicitement nommé, il n'y a aucune difficulté. Dans le cas
contraire, le système a engendré et attribué un nom qu'il faut
découvrir. La commande \d
table
de psql peut être utile ici ; d'autres interfaces
offrent aussi la possibilité d'examiner les détails de table. La
commande est :
ALTER TABLE produits DROP CONSTRAINT un_nom;
(Dans le cas d'un nom de contrainte engendré, comme $2, il est nécessaire de l'entourer de guillemets
doubles pour en faire un identifiant valable.)
Comme pour la suppression d'une colonne, CASCADE peut être ajouté pour supprimer une
contrainte dont dépendent d'autres objets. Une contrainte de clé
étrangère, par exemple, dépend d'une contrainte de clé primaire ou
d'unicité sur la(les) colonne(s) référencée(s).
Cela fonctionne de la même manière pour tous les types de
contrainte, à l'exception des contraintes NOT NULL. Pour supprimer
une contrainte NOT NULL, on écrit
ALTER TABLE produits ALTER COLUMN no_produit DROP NOT NULL;
(Les contraintes NOT NULL n'ont pas de noms.)
5.5.5. Modifier la valeur par défaut d'une colonne
La commande de définition d'une nouvelle valeur par défaut de
colonne ressemble à celle-ci :
ALTER TABLE produits ALTER COLUMN prix SET DEFAULT 7.77;
Cela n'affecte pas les lignes existantes de la table, mais
uniquement la valeur par défaut pour les futures commandes
INSERT
.
Pour retirer toute valeur par défaut, on écrit
ALTER TABLE produits ALTER COLUMN prix DROP DEFAULT;
C'est équivalent à mettre la valeur par défaut à NULL. En
conséquence, il n'y a pas d'erreur à retirer une valeur par défaut
qui n'a pas été définie car NULL est la valeur par défaut
implicite.
5.5.6. Modifier le type de données d'une colonne
La commande de conversion du type de données d'une colonne
ressemble à celle-ci :
ALTER TABLE produits ALTER COLUMN prix TYPE numeric(10,2);
Elle ne peut réussir que si chaque valeur de la colonne peut être
convertie dans le nouveau type par une conversion implicite. Si une
conversion plus complexe est nécessaire, une clause USING peut être ajoutée qui indique comment calculer
les nouvelles valeurs à partir des anciennes.
PostgreSQL™ tente de
convertir la valeur par défaut de la colonne le cas échéant, ainsi
que toute contrainte impliquant la colonne. Mais ces conversions
peuvent échouer ou produire des résultats surprenants. Il est
souvent préférable de supprimer les contraintes de la colonne avant
d'en modifier le type, puis d'ajouter ensuite les contraintes
convenablement modifiées.
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;