6.5 Définition de données : CREATE , DROP , ALTER
6 Référence du langage MySQL
Manuel de Référence MySQL 4.1 : Version Française
. Syntaxe de CREATE DATABASE . Syntaxe de DROP DATABASE . Syntaxe de CREATE TABLE ->Syntaxe de ALTER TABLE . Syntaxe de RENAME TABLE . Syntaxe de DROP TABLE . Syntaxe de CREATE INDEX . Syntaxe de DROP INDEX
|
6.5.4 Syntaxe de ALTER TABLE
ALTER [IGNORE] TABLE nom_de_table alter_spec [, alter_spec ...] alter_specification: ADD [COLUMN] create_definition [FIRST | AFTER nom_colonne ] ou ADD [COLUMN] (create_definition, create_definition,...) ou ADD INDEX [nom_index] (index_nom_colonne,...) ou ADD PRIMARY KEY (index_nom_colonne,...) ou ADD UNIQUE [nom_index] (index_nom_colonne,...) ou ADD FULLTEXT [nom_index] (index_nom_colonne,...) ou ADD [CONSTRAINT symbol] FOREIGN KEY [nom_index] (nom_colonne_index,...) [reference_definition] ou ALTER [COLUMN] nom_colonne {SET DEFAULT literal | DROP DEFAULT} ou CHANGE [COLUMN] ancien_nom_colonne create_definition [FIRST | AFTER nom_de_colonne] ou MODIFY [COLUMN] create_definition [FIRST | AFTER nom_colonne] ou DROP [COLUMN] nom_colonne ou DROP PRIMARY KEY ou DROP INDEX nom_index ou DISABLE KEYS ou ENABLE KEYS ou RENAME [TO] nouveau_nom_de_table ou ORDER BY col ou table_options
|
ALTER TABLE
vous permet de changer la structure d'une table existante.
Par exemple, vous pouvez ajouter ou supprimer des colonnes, des index, changer le type
des colonnes existantes, renommer ces colonnes, ou la table elle-même.
Vous pouvez de même changer le commentaire sur la table, ou le type de celle-ci.
Syntaxe de
CREATE TABLE
.Si vous utilisez
ALTER TABLE
pour modifier les spécifications d'une colonne
mais que
DESCRIBE nom_de_table
vous indique que cette colonne n'a pas été modifiée,
il est possible que MySQL ait ignoré vos modifications pour une des raisons décrite dans
Silent column changes .
Par exemple, si vous essayez de changer une colonne de type
VARCHAR
en
CHAR
,
MySQL continuera d'utiliser
VARCHAR
si la table contient d'autres colonnes de taille
variable.
ALTER TABLE
effectue une copie temporaire de la table originale. Les modifications sont
faites sur cette copie, puis l'original est effacée, et enfin la copie est renommée pour remplacer
l'originale.
Cette méthode permet de rediriger toutes les commandes automatiquement vers la nouvelle
table sans pertes. Durant l'exécution de
ALTER TABLE
, la table originale est lisible par
d'autres clients. Les modifications et insertions sont reportées jusqu'à ce que la nouvelle table
soit prête.
Notez que si vous utilisez une autre option que
RENAME
avec
ALTER TABLE
,
MySQL créera toujours une table temporaire, même si les données n'ont pas
besoin d'être copiées (comme quand vous changez le nom d'une colonne).
Nous avons prévu de corriger cela dans les versions suivantes, mais comme la commande
ALTER TABLE
n'est pas utilisée très souvent, cette correction ne fait pas partie
de nos priorités.
Pour les tables
MyISAM
, vous pouvez accélérer la recréation de l'index (qui est la plus lente de
tout le processus) en choisissant une valeur élevée pour la variable
myisam_sort_buffer_size
.
Voilà un exemple qui montre quelques utilisations de
ALTER TABLE
. On commence par
une table
t1
créée comme suit :
mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10));
|
Pour renommer la table de
t1
à
t2
:
mysql> ALTER TABLE t1 RENAME t2;
|
Pour changer une colonne
a
de
INTEGER
en
TINYINT NOT NULL
(en laissant le même nom), et pour changer une colonne
b
de
CHAR(10)
à
CHAR(20)
et la renommant de
b
en
c
:
mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);
|
Pour ajouter une nouvelle colonne
TIMESTAMP
nommée
d
:
mysql> ALTER TABLE t2 ADD d TIMESTAMP;
|
Pour ajouter un index sur une colonne
d
, et rendre la colonne
a
la clef primaire :
mysql> ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);
|
Pour effacer la colonne
c
:
mysql> ALTER TABLE t2 DROP COLUMN c;
|
Pour ajouter une nouvelle colonne
AUTO_INCREMENT
nommée
c
:
mysql> ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT, ADD INDEX (c);
|
Notez que nous avons indexé
c
, car les colonnes
AUTO_INCREMENT
doivent être indexées, et que nous définissons
aussi
c
en tant que
NOT NULL
, car les colonnes indexées ne peuvent être
NULL
.Quand vous ajoutez une colonne
AUTO_INCREMENT
, les valeurs de la colonne sont remplies
automatiquement pour vous. Vous pouvez choisir la valeur de départ pour l'indexation en utilisant
SET INSERT_ID=#
avant
ALTER TABLE
ou en utilisant l'option
AUTO_INCREMENT = #
de la table.
Syntaxe de
SET
.
Avec les tables de type
MyISAM
, si vous ne changez pas la colonne
AUTO_INCREMENT
,
l'indice d'auto-incrémentation ne sera pas affecté. Si vous effacez une colonne
AUTO_INCREMENT
puis en ajoutez une autre, l'indexation recommencera à partir de 1.
Problèmes avec
ALTER TABLE
. .
|