ALTER TABLE
La commande ALTER TABLE permet de modifier la structure d'une table existante. Si la table est utilisée par une requête active, la commande ALTER attend que cette requête se termine.
- Modifier ou supprimer une colonne par défaut. Les valeurs par défaut que vous définissez ne s'appliquent qu'aux commandes INSERT ultérieures, et non aux lignes déjà présentes dans la table.
- Renommer une colonne ou une table sans modifier le type ou la taille des données dans la colonne ou la table. Vous pouvez omettre la colonne des mots-clés.
- Ajouter ou supprimer une contrainte de table ou de colonne. Vous ne pouvez pas modifier une contrainte. Vous devez alors supprimer la contrainte et en créer une nouvelle.
- Modifier la longueur d'une colonne varchar.
Si une table est référencée par une procédure stockée, l'ajout ou la suppression d'une colonne n'est pas autorisé. Vous devez d'abord supprimer la procédure stockée avant d'exécuter la commande ALTER TABLE, puis recréer la procédure stockée après la modification de la table.
Syntaxe
ALTER TABLE <table> <action><action> peut être l'un des éléments suivants :ADD COLUMN <col> <type> [<col_constraint>][,…] |
ADD <table_constraint> |
ALTER [COLUMN] <col> { SET DEFAULT <value> | DROP DEFAULT } |
DROP [COLUMN] column_name[,column_name…] {CASCADE | RESTRICT } |
DROP CONSTRAINT <constraint_name> {CASCADE | RESTRICT} |
MODIFY COLUMN (<col> VARCHAR(<maxsize>)) |
ORGANIZE ON {(<columns>) | NONE} |
OWNER TO <user_name> |
RENAME [COLUMN] <col> TO <new_col_name> |
RENAME TO <new_table> |
SET PRIVILEGES TO <table> |
DATA_VERSION_RETENTION_TIME <number-of-days>
<col_constraint> représente :[ CONSTRAINT <constraint_name> ]
{NOT NULL | NULL | UNIQUE | PRIMARY KEY | DEFAULT <value> | <ref>}
[ [ [ NOT ] DEFERRABLE ] { INITIALLY DEFERRED | INITIALLY IMMEDIATE } |
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ NOT ] DEFERRABLE ]<table_constraint> représente :[ CONSTRAINT <constraint_name> ]
{UNIQUE (<col>[,<col>…] ) |
PRIMARY KEY (<pkcol_name>[,<pkcol_name>…] ) |
FOREIGN KEY (<fkcol_name>[,<fkcol_name>…] ) <ref>}
[ [ [ NOT ] DEFERRABLE ] { INITIALLY DEFERRED | INITIALLY IMMEDIATE } |
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ NOT ] DEFERRABLE ]<ref> représente :REFERENCES <reftable> [ (<refcol_name>[,<refcol_name>…] ) ]
[ MATCH FULL ]
[ ON UPDATE {CASCADE | RESTRICT | SET NULL | SET DEFAULT | NO ACTION} ]
[ ON DELETE {CASCADE | RESTRICT | SET NULL | SET DEFAULT | NO ACTION} ]Entrées
La commande ALTER TABLE prend en compte les données suivantes :
| Entrée | Descriptif |
|---|---|
| <table> | Le nom de la table à modifier. |
| <action> | L'action à effectuer pour la table spécifiée :
|
| <col> | Nom d'une colonne. |
| <nom_utilisateur> | Le nom d'un utilisateur. |
| <nouveau_nom_du_col> | Le nouveau nom à donner à la colonne. |
| <nouveau_table> | Le nouveau nom de la table. |
| <nom_de_la_contrainte> | Nom à donner à une contrainte de colonne ou de table. Si vous n'indiquez pas de nom, le système en génère un. |
| NON REPORTABLE | REPORTABLE | Contrôle si la contrainte peut être reportée à la fin de la transaction. NOT DEFERRABLE est la valeur par défaut. Netezza Performance Server ne prend pas en charge le contrôle des contraintes et l'intégrité référentielle) |
| INITIALLY | Spécifie soit DEFERRED (à la fin de la transaction), soit IMMEDIATE (à la fin de chaque relevé). |
| NON NUL | NUL | Si la colonne est autorisée à contenir des valeurs nulles. NULL est la valeur par défaut. |
| UNIQUE (contrainte de colonne et de table) | Si chaque valeur de la colonne doit être unique. |
| PRIMARY KEY (contrainte de colonne et de table) | Indique si les colonnes spécifiées doivent constituer la clé primaire de la table. Cette contrainte est essentiellement une combinaison des contraintes UNIQUE et NOT NULL, mais l'identification d'un ensemble de colonnes en tant que clé primaire fournit également des métadonnées sur la conception du schéma. Une clé primaire implique que d'autres tables peuvent s'appuyer sur cet ensemble de colonnes comme identifiant unique pour les lignes. Vous ne pouvez spécifier qu'une seule contrainte de clé primaire pour une table, soit en tant que contrainte de colonne, soit en tant que contrainte de table. L'ensemble des colonnes qui constituent la clé primaire doit être différent de tout autre ensemble de colonnes nommé par une contrainte unique définie pour la table. |
| DEFAULT (contrainte de colonne) | Valeur par défaut à placer dans chaque ligne pour cette colonne. |
| REFERENCES (contrainte de colonne) | Les colonnes spécifiées de la nouvelle table ne doivent contenir que des valeurs qui correspondent aux valeurs des colonnes spécifiées de la table spécifiée. |
| FOREIGN KEY et REFERENCES table (contrainte de table) | Les colonnes spécifiées de la nouvelle table ne doivent contenir que des valeurs qui correspondent aux valeurs des colonnes spécifiées de la table spécifiée. Si vous ne spécifiez pas de colonne, la valeur doit correspondre à la clé primaire de la table. Les colonnes spécifiées de la table référencée doivent avoir une contrainte de clé unique ou primaire dans cette table. |
| MATCH COMPLET | MATCH FULL empêche une colonne d'une clé étrangère multicolonne d'être nulle si d'autres parties de la clé étrangère ne sont pas nulles. Il s'agit de la valeur par défaut. MATCH PARTIAL n'est pas pris en charge. |
| À LA MISE À JOUR | À LA SUPPRESSION | Action à entreprendre lorsque la table ou les colonnes spécifiées sont mises à jour ou supprimées :
|
| TEMPS DE CONSERVATION DES DONNÉES | Modifie la durée de conservation d'un tableau. Si la durée de conservation est nulle, vous devez spécifier une valeur non nulle de DATA_VERSION_RETENTION_TIME pour exécuter des requêtes sur les voyages dans le temps. Si vous souhaitez modifier DATA_VERSION_RETENTION_TIME et lui attribuer une valeur non nulle pour une table temporaire, sécurisée, versionnée ou externe, la commande échoue. La valeur maximale autorisée est de 99 jours. Si la valeur de DATA_VERSION_RETENTION_TIME pour une table est fixée à 0, la table n'est plus une table temporelle et aucune donnée historique pour la table n'est disponible pour les requêtes de voyage dans le temps. Vous ne pouvez pas exécuter de requêtes sur la durée de conservation pour les tables dont la durée de conservation est fixée à 0. Pour plus d'informations sur les voyages dans le temps et DATA_VERSION_RETENTION_TIME, reportez-vous à la section Premiers pas dans les voyages dans le temps. |
Sorties
La commande ALTER TABLE produit les résultats suivants :
| Sortie | Descriptif |
|---|---|
| ALTER | La commande a abouti. |
| ERROR | La table ou la colonne spécifiée n'est pas disponible. |
Droits
Vous devez être l'utilisateur admin, le propriétaire de la table, le propriétaire de la base de données ou du schéma dans lequel la table est définie, ou votre compte doit avoir le privilège Alter pour la table ou pour la classe d'objets Table. Si vous changez le propriétaire de la table, vous devez avoir l'accès Liste au compte d'utilisateur.
Utilisation
- Supprime la valeur par défaut d'une colonne :
MYDB.SCH1(USER)=> ALTER TABLE distributors ALTER COLUMN address DROP DEFAULT; - Modifier la longueur du varchar pour une colonne :
MYDB.SCH1(USER)=> ALTER TABLE t3 MODIFY COLUMN (col1 VARCHAR(6)); - Modifier le nom d'une colonne :
MYDB.SCH1(USER)=> ALTER TABLE distributors RENAME COLUMN address TO city; - Modifier le nom d'une table :
MYDB.SCH1(USER)=> ALTER TABLE distributors RENAME TO suppliers; - Modifier le propriétaire de la table :
MYDB.SCH1(USER)=> ALTER TABLE distributors OWNER TO carmen; - Remplacer les privilèges par ceux définis pour une autre table :
MYDB.SCH1(USER)=> ALTER TABLE distributors SET PRIVILEGES TO suppliers; - Ajouter une contrainte :
MYDB.SCH1(USER)=> ALTER TABLE distributors ADD CONSTRAINT empkey PRIMARY KEY(col1) INITIALLY IMMEDIATE; - Supprimer une contrainte :
MYDB.SCH1(USER)=> ALTER TABLE distributors DROP CONSTRAINT empkey CASCADE; - Transformer des tables temporelles en tables non temporelles :
ALTER TABLE PRODUCT DATA_VERSION_RETENTION_TIME 0; - Transformer des tables non temporelles en tables temporelles :
ALTER TABLE PRODUCT DATA_VERSION_RETENTION_TIME 30;Si vous avez d'abord désactivé votre table temporelle, puis converti la même table en table temporelle, vous n'avez pas accès aux lignes historiques antérieures de cette table. Les données historiques sont collectées lorsque des lignes sont supprimées ou mises à jour après la conversion du tableau en données temporelles.