ALTER TABLE

Nom

ALTER TABLE -- change la définition d'une table

Synopsis

ALTER TABLE [ ONLY ] nom [ * ]
    ADD [ COLUMN ] colonne type [ contraintedecolonne [ ... ] ]
ALTER TABLE [ ONLY ] nom [ * ]
    DROP [ COLUMN ] colonne [ RESTRICT | CASCADE ]
ALTER TABLE [ ONLY ] nom [ * ]
    ALTER [ COLUMN ] colonne { SET DEFAULT expression | DROP DEFAULT }
ALTER TABLE [ ONLY ] nom [ * ]
    ALTER [ COLUMN ] colonne { SET | DROP } NOT NULL
ALTER TABLE [ ONLY ] nom [ * ]
    ALTER [ COLUMN ] colonne SET STATISTICS entier
ALTER TABLE [ ONLY ] nom [ * ]
    ALTER [ COLUMN ] colonne SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }
ALTER TABLE [ ONLY ] nom [ * ]
    SET WITHOUT OIDS
ALTER TABLE [ ONLY ] nom [ * ]
    RENAME [ COLUMN ] colonne TO nouvellecolonne
ALTER TABLE nom
    RENAME TO nouveaunom
ALTER TABLE [ ONLY ] nom [ * ]
    ADD contraintedetable
ALTER TABLE [ ONLY ] nom [ * ]
    DROP CONSTRAINT nomdecontrainte [ RESTRICT | CASCADE ]
ALTER TABLE nom
    OWNER TO nouveauproprietaire
ALTER TABLE nom
    CLUSTER ON nomindex

Description

ALTER TABLE change la définition d'une table existante. Il existe plusieurs variantes :

ADD COLUMN

Cette variante ajoute une nouvelle colonne à la table en utilisant la même syntaxe que CREATE TABLE.

DROP COLUMN

Cette variante supprime une colonne d'une table. Les index et les contraintes de table référençant cette colonne sont automatiquement supprimés. Il faut utiliser l'option CASCADE si certains objets hors de la table dépendent de cette colonne, comme par exemple des références de clés étrangères ou des vues.

SET/DROP DEFAULT

Ces variantes ajoutent ou enlèvent des valeurs par défaut pour une colonne. Ces valeurs par défaut ne s'appliquent qu'aux prochaines commandes INSERT. Elles ne modifient pas les lignes déjà présentes dans la table. Des valeurs par défaut peuvent aussi être créées pour les vues. Dans ce cas, elles sont ajoutées aux commandes INSERT de la vue avant que la règle ON INSERT de la vue ne soit appliquée.

SET/DROP NOT NULL

Ces variantes changent le fait que la colonne indique autoriser les valeurs NULL ou non. SET NOT NULL ne peut être utilisé que si la colonne ne contient pas de valeurs NULL.

SET STATISTICS

Cette variante permet de modifier l'objectif de collecte de statistiques par colonne pour les opérations d'analyse (ANALYZE) à venir. L'objectif prend une valeur entre 0 et 1000. Le mettre à -1 pour utiliser l'objectif de statistiques par défaut du système.

SET STORAGE

Ces variantes changent le mode de stockage pour une colonne. Cela permet de contrôler si cette colonne est gardée en ligne dans la table ou bien externalisée dans une table supplémentaire, et si les données doivent être compressées ou non. PLAIN doit être utilisé pour les valeurs de longueur fixe, comme les integer et est en ligne non compressé. MAIN est pour les données en ligne compressibles. EXTERNAL est pour les données externes non compressées. EXTENDED est pour les données externes compressées. EXTENDED est la valeur par défaut pour tous les types qui le supportent. L'utilisation d'EXTERNAL, par exemple, rendra les opérations d'extraction de sous chaînes plus rapides mais utilisera plus d'espace de stockage.

SET WITHOUT OIDS

Cette forme supprime la colonne oid de la table. La suppression des OID d'une table n'intervient pas immédiatement. L'espace occupé par l'OID est récupéré lorsque la ligne est mise à jour. Si la ligne n'est pas mise à jour, l'espace utilisé par l'OID et sa valeur est gardé indéfiniment. Cette commande est sémantiquement similaire au processus de suppression de colonne avec DROP COLUMN.

RENAME

La variante RENAME change le nom d'une table (ou d'un index, d'une séquence, d'une vue) ou le nom d'une colonne de la table. Elle est sans effet sur les données stockées.

ADD contraintedetable

Cette variante ajoute une nouvelle contrainte à une table en utilisant la même syntaxe que CREATE TABLE.

DROP CONSTRAINT

Cette variante supprime des contraintes d'une table. Actuellement, les contraintes n'ont pas nécessairement un nom unique, si bien qu'il peut y avoir plusieurs contraintes qui ont le nom donné en paramètre. Toutes ces contraintes sont supprimées.

OWNER

Cette variante change le propriétaire d'une table, d'un index, d'une séquence, ou d'une vue. Le nouveau propriétaire est celui passé en paramètre.

CLUSTER

Cette variante marque la table pour une future opération de réorganisation en cluster (CLUSTER).

Il faut être propriétaire de la table pour utiliser ALTER TABLE, sauf pour ALTER TABLE OWNER, qui ne peut être utilisée que par un super utilisateur.

Paramètres

nom

Le nom (éventuellement précisé par un schéma) d'une table existante, que l'on veut modifier. Si ONLY est indiqué, cette table seulement est modifiée. Si ONLY est absent, alors la table et toutes ses tables filles (s'il y en a) sont modifiées. * peut être ajouté au nom de la table pour indiquer que ses tables descendantes doivent être modifiées. Dans la version courante, c'est le comportement par défaut. Dans les versions antérieures à la 7.1, ONLY était le comportement par défaut. Le comportement par défaut peut être modifié en changeant le paramètre de configuration sql_inheritance.

colonne

Nom d'une colonne existante ou nouvelle.

type

Type de données de la nouvelle colonne.

nouvellecolonne

Nouveau nom d'une colonne existante.

nouveaunom

Nouveau nom de la table.

contraintedetable

Nouvelle contrainte de table pour la table.

nomdecontrainte

Nom d'une contrainte existante à supprimer

nouveauproprietaire

Nom d'utilisateur du nouveau propriétaire de la table.

nomindex

Nom de l'index sur lequel la table doit être réorganisée en cluster.

CASCADE

Supprime automatiquement les objets qui dépendent de la colonne ou de la contrainte supprimée (par exemple, les vues référençant cette colonne).

RESTRICT

Refuse de supprimer la colonne ou la contrainte s'il y a des objets dépendants. C'est le comportement par défaut.

Notes

Le mot clé COLUMN n'est pas nécessaire. Il peut être omis.

La version actuelle de ADD COLUMN ne permet pas d'utiliser les clauses de valeur par défaut ni de contrainte NOT NULL. La nouvelle colonne a toujours toutes ses valeurs NULL. Il faut utiliser la forme SET DEFAULT de ALTER TABLE pour modifier ensuite la valeur par défaut. (Vous voudrez peut-être aussi mettre à jour les lignes existantes de la table avec la nouvelle valeur par défaut en utilisant UPDATE.) Si vous voulez indiquer qu'une colonne n'est jamais nulle, utilisez la variante SET NOT NULL après avoir entré des valeurs non NULL pour cette colonne pour toutes les lignes de la table.

La forme DROP COLUMN ne supprime pas physiquement la colonne, mais la rend simplement invisible au SQL. Par la suite, les ordres d'insertion et de mise à jour sur cette table stockeront une valeur NULL pour la colonne. Du coup, supprimer une colonne ne réduit pas immédiatement la taille de la table sur le disque car l'espace occupé par la colonne n'est pas récupéré. Cet espace sera récupéré petit à petit, au fur et à mesure des mises à jour des lignes de la table. Pour récupérer immédiatement l'espace, il faut faire un faux UPDATE sur toutes les lignes de la table, puis la réorganiser avec un vacuum, comme ce qui suit :

UPDATE table SET col = col;
VACUUM FULL table;

Si une table a des tables descendantes, il n'est pas possible d'ajouter ou renommer une colonne dans la table parent sans le faire aussi pour ses descendantes. Donc, la commande ALTER TABLE ONLY est rejetée. Ceci assure que les descendantes ont toujours des colonnes correspondant à celles de la table parente.

Un appel récursif à DROP COLUMN supprimera une colonne d'une table descendante si et seulement si la table descendante n'hérite pas de cette colonne d'une autre table et n'a jamais eu de définition indépendante de la colonne. Une suppression de colonne non récursive (c'est à dire une commande ALTER TABLE ONLY ... DROP COLUMN) ne supprime jamais les colonnes descendantes mais les marque comme définies de manière indépendante, plutôt qu'héritées.

On ne peut pas changer quoi que ce soit dans une table du catalogue système.

Voir la commande CREATE TABLE pour avoir une description plus complète des paramètres valides. Chapitre 5 donne plus d'informations sur l'héritage.

Exemples

Pour ajouter une colonne de type varchar à une table :

ALTER TABLE distributeurs ADD COLUMN adresse varchar(30);

Pour supprimer une colonne d'une table :

ALTER TABLE distributeurs DROP COLUMN adresse RESTRICT;

Pour renommer une colonne existante :

ALTER TABLE distributeurs RENAME COLUMN adresse TO city;

Pour renommer une table existante :

ALTER TABLE distributeurs RENAME TO suppliers;

Pour ajouter une contrainte NOT NULL à une colonne :

ALTER TABLE distributeurs ALTER COLUMN rue SET NOT NULL;

Pour supprimer une contrainte NOT NULL d'une colonne :

ALTER TABLE distributeurs ALTER COLUMN rue DROP NOT NULL;

Pour ajouter une contrainte de vérification sur une table :

ALTER TABLE distributeurs ADD CONSTRAINT verif_zip CHECK (char_length(zipcode) = 5);

Pour supprimer une contrainte de vérification d'une table et de toutes ses tables filles :

ALTER TABLE distributeurs DROP CONSTRAINT verif_zip;

Pour ajouter une contrainte de clé étrangère à une table :

ALTER TABLE distributeurs ADD CONSTRAINT distfk FOREIGN KEY (adresse) REFERENCES adresses (adresse) MATCH FULL;

Pour ajouter une contrainte unique (multicolonnes) à une table :

ALTER TABLE distributeurs ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode);

Pour ajouter une clé primaire nommée automatiquement à une table. Remarque : une table ne peut avoir qu'une seule clé primaire dans toute sa vie.

ALTER TABLE distributeurs ADD PRIMARY KEY (dist_id);

Compatibilité

La variante ADD COLUMN est conforme au standard SQL, à l'exception du fait qu'elle ne supporte pas les contraintes par défaut et NOT NULL, comme expliqué précédemment. La variante ALTER COLUMN est complètement compatible.

Les clauses pour renommer des tables, des colonnes, des indexes, des vues et des séquences sont des extensions du standard SQL.

ALTER TABLE DROP COLUMN peut être utilisé pour supprimer la seule colonne d'une table, laissant une table sans colonne. C'est une extension de SQL, qui ne permet pas les tables sans colonne.