7.7 ALTER TABLE

ALTER [IGNORE] TABLE Nom_table alter_spec [, alter_spec ...]
alter_specification:@:
ADD [COLUMN] create_definition [FIRST | AFTER column_name ]
ou ADD INDEX [Nom_index] (index_Nom_col,...)
ou ADD PRIMARY KEY (index_Nom_col,...)
ou ADD UNIQUE [Nom_index] (index_Nom_col,...)
ou ALTER [COLUMN] Nom_col {SET DEFAULT literal | DROP DEFAULT}
ou CHANGE [COLUMN] old_Nom_col create_definition
ou MODIFY [COLUMN] create_definition
ou DROP [COLUMN] Nom_col
ou DROP PRIMARY KEY
ou DROP INDEX key_name
ou RENAME [AS] new_Nom_table
ou table_option

ALTER TABLE modifie la structure d'une table existante. Par exemple, il est possible d'ajouter ou d'effacer des colonnes, de créer et détruire des index, de changer le type d'une colonne ou de la renommer, voire même de renommer la table elle-même. Il est aussi possible de changer le commentaire de la table et son type. Voir CREATE TABLE.

Si, lors d'une modification de type de colonne, la commande DESCRIBE Nom_table indique que la colonne n'a pas changé de type, il est possible que MySQL ait ignoré la modification pour une des raisons décrites dans 7.6.1 Modifications automatiques de type de colonne. Par exemple, si il existe plusieurs colonne de type de longueur variable, rien de sert de tenter de forcer une colonne du type VARCHAR à CHAR.

ALTER TABLE fonctionne en effectuant une copie temporaire de la table originale. La modification est effectuée sur la copie, puis l'originale est remplacée par la copie modifiée. Toutes les mises à jours sont automatiquement appelé, et sont faites dans un mode sans erreur. Pendant la modification, la table originale est toujours accessible en lecture par les autres clients. Les mises à jour et les écritures sont reportées jusqu'à la fin de la modification.

mysql> ALTER TABLE t1 CHANGE a b INTEGER;

Pour changer le type de la colonne mais pas son nom, la syntaxe de CHANGE requiert deux noms de colonnes, même si ils sont identiques. Par exemple :@:

mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;

Cependant, à partir de MySQL 3.22.16a, il est possible d'utiliser la clause MODIFY pour changer le type de la colonne sans le renommer:@:

mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;

Voici quelques exemples d'utilisation de la commande ALTER TABLE. On supposera que la table t1, créée ci-dessous, existe :@:

mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10));

Renomme la table de t1 et t2:@:

mysql> ALTER TABLE t1 RENAME t2;

Change le type de la colonne a de INTEGER en TINYINT NOT NULL (mais ne change pas le nom), et change le type de la colonne b de CHAR(10) en CHAR(20) et renomme cette colonne en c.

mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);

Ajoute une nouvelle colonne d, de type TIMESTAMP.

mysql> ALTER TABLE t2 ADD d TIMESTAMP;

Ajoute un index sur la colonne d, et fait de la colonne a une PRIMARY KEY

mysql> ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);

Efface la colonne c:@:

mysql> ALTER TABLE t2 DROP COLUMN c;

Ajoute une nouvelle colonne de type AUTO_INCREMENT integer , nommée c:@:

mysql> ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,
ADD INDEX (c);

Il faut remarquer que la colonne c a été indexée, car les colonnes de type AUTO_INCREMENT doivent être indexée, ce qui implique c doit avoir l'attribut NOT NULL, puisque les colonnes indexées ne peuvent pas avoir de valeur à NULL.