:: DEVELOPER ZONE
ALTER [IGNORE] TABLE tbl_name
alter_specification [, alter_specification] ...
alter_specification:
ADD [COLUMN] column_definition [FIRST | AFTER col_name ]
| ADD [COLUMN] (column_definition,...)
| ADD INDEX [index_name] [index_type] (index_col_name,...)
| ADD [CONSTRAINT [symbol]]
PRIMARY KEY [index_type] (index_col_name,...)
| ADD [CONSTRAINT [symbol]]
UNIQUE [index_name] [index_type] (index_col_name,...)
| ADD [FULLTEXT|SPATIAL] [index_name] (index_col_name,...)
| ADD [CONSTRAINT [symbol]]
FOREIGN KEY [index_name] (index_col_name,...)
[reference_definition]
| ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
| CHANGE [COLUMN] old_col_name column_definition
[FIRST|AFTER col_name]
| MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]
| DROP [COLUMN] col_name
| DROP PRIMARY KEY
| DROP INDEX index_name
| DROP FOREIGN KEY fk_symbol
| DISABLE KEYS
| ENABLE KEYS
| RENAME [TO] new_tbl_name
| ORDER BY col_name
| CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
| [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name]
| DISCARD TABLESPACE
| IMPORT TABLESPACE
| 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.
La syntaxe de nombreuses altérations est similaires aux clauses de la commande
CREATE TABLE.
See Section 14.2.6, « 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
Section 14.2.6.1, « Modification automatique du type de colonnes ».
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 réindexation (qui est la partie la plus lente de la modification d'une table)
en donnant à la variable système myisam_sort_buffer_size une valeur plus grande.
Pour utiliser ALTER TABLE, vous devez avoir les droits ALTER, INSERT,
et CREATE sur la table.
IGNORE est une extension MySQL pour ANSI SQL92.
Cette option contrôle la fa¸on dont ALTER TABLE fonctionne s'il y a des
duplications sur une clef unique de la nouvelle table.
Si IGNORE n'est pas spécifiée, la copie est annulée et la table originale est restaurée.
Si IGNORE est spécifiée, les lignes contenant les éléments doublons de la table seront
effacées, hormis la première, qui sera conservée.
Vous pouvez effectuer plusieurs opérations de ADD, ALTER, DROP, et CHANGE
dans une même commande ALTER TABLE.
C'est une extension de MySQL à la norme ANSI SQL92, qui n'autorise qu'une seule modification par commande
ALTER TABLE.
CHANGE nom_colonne, DROP nom_colonne, et DROP INDEX sont des extensions de MySQL à la norme ANSI SQL92.
MODIFY est une extension Oracle à ALTER TABLE.
Le mot optionnel COLUMN est purement de la fioriture et peut être ignoré.
Si vous utilisez ALTER TABLE nom_de_table RENAME TO nouveau_nom sans autre option, MySQL va
simplement renommer les fichiers qui correspondent à la table nom_de_table.
Il n'y a pas de création de fichier temporaire.
See Section 14.2.12, « Syntaxe de RENAME TABLE ».
La définition create_definition utilise la même syntaxe pour les clauses ADD et CHANGE
que dans CREATE TABLE.
Notez que cette syntaxe inclut le nom de la colonne, et pas seulement son type
See Section 14.2.6, « Syntaxe de CREATE TABLE ».
Vous pouvez renommer une colonne avec la syntaxe CHANGE ancien_nom_de_colonne create_definition.
Pour cela, indiquez l'ancien nom de la colonne, puis le nouveau nom et son type courant.
Par exemple, pour renommer une colonne de type INTEGER, de a en b, vous pouvez faire ceci :
mysql> ALTER TABLE t1 CHANGE a b INTEGER;
Si vous ne voulez changer que le type de la colonne, avec la clause CHANGE
vous devrez redonner le nom de la colonne. Par exemple :
mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;
Cependant, à partir de la version 3.22.16a de MySQL,
vous pouvez aussi utiliser la clause MODIFY pour changer le type
d'une colonne sans la renommer :
mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;
Si vous utilisez les clauses CHANGE ou MODIFY pour réduire la
taille d'une colonne qui comportait un index sur une partie de la colonne
(par exemple, si vous aviez un index sur 10 caractères d'une colonne de
type VARCHAR), vous ne pouvez pas rendre la colonne plus petite
que le nombre de caractères indexés.
Quand vous changez le type d'une colonne avec CHANGE ou MODIFY,
MySQL essaye de convertir les données au niveau type dans la mesure du possible.
A partir de la version 3.22 de MySQL, vous pouvez utiliser FIRST ou
ADD ... AFTER nom_colonne pour ajouter la colonne à un endroit spécifique
dans la table. Par défaut, la colonne est ajoutée à la fin.
A partir de la version 4.0.1, vous pouvez aussi utiliser les mots clés
FIRST et AFTER avec CHANGE ou MODIFY.
ALTER COLUMN spécifie une nouvelle valeur par défaut pour une colonne ou enlève l'ancienne.
si l'ancienne valeur est effacée et que la colonne peut être NULL, la nouvelle valeur par
défaut sera NULL. Si la colonne ne peut être NULL, MySQL assigne une valeur par défaut,
comme défini dans Section 14.2.6, « Syntaxe de CREATE TABLE ».
DROP INDEX supprime un index. C'est une extension MySQL à la norme ANSI SQL92.
See Section 14.2.9, « Syntaxe de DROP INDEX ».
Si des colonnes sont effacées d'une table, ces colonnes sont aussi supprimés des index dont elles font partie. Si toutes les colonnes qui forment un index sont effacées, l'index lui même est supprimé.
Si une table ne comporte qu'une seule colonne, La colonne ne peut être supprimée.
Si vous voulez effacer la table, utilisez la commande DROP TABLE.
DROP PRIMARY KEY supprime la clef primaire. Si cette clef n'existe pas,
cette commande effacera le premier index UNIQUE de la table.
(MySQL marque la première clef UNIQUE en tant que PRIMARY KEY
si aucune PRIMARY KEY n'a été spécifiée explicitement.)
Si vous ajoutez un UNIQUE INDEX ou PRIMARY KEY à une table,
c'est enregistré avant les index non-UNIQUE pour que MySQL puisse
détecter les valeurs dupliquées aussi vite que possible.
ORDER BY vous permet de créer une nouvelle table tout en ordonnant
les lignes par défaut. Notez que cet ordre ne sera pas conservé après les
prochaines insertions et modifications.
Dans certains cas, cela aide MySQL si les colonnes sont dans l'ordre dans
lequel vous allez trier les valeurs.
Cette option n'est vraiment utile que si vous savez à l'avance dans quel
ordre vous effectuerez les tris : vous y gagnerez alors en performances.
Si vous utilisez ALTER TABLE sur une table MyISAM, tous les index
non-uniques sont créés par des opérations séparées. (comme dans REPAIR).
Cela devrait rendre ALTER TABLE plus rapide quand vous avez beaucoup d'index.
Depuis la version 4.0, la fonctionnalité ci-dessus
peut être activée explicitement. ALTER TABLE ... DISABLE KEYS
force MySQL à ne plus mettre à jour les index non-uniques
pour les tables au format MyISAM.
ALTER TABLE ... ENABLE KEYS doit alors être utilisé pour recréer les index manquants.
Comme MySQL le fait avec un algorithme spécial qui est plus rapide que le fait d'insérer les
clefs une par une, désactiver les clefs peut vous faire gagner en performances.
Les clauses FOREIGN KEY et REFERENCES sont supportées par le moteur
de tables InnoDB, qui implémente les clauses
ADD [CONSTRAINT [symbol]] FOREIGN KEY (...) REFERENCES ... (...).
See Section 16.7.4, « Contraintes de clés étrangères FOREIGN KEY ».
Pour les autres moteurs de stockages, ces clauses sont lues mais ignorées.
La clause CHECK est analysée mais ignorée par tous les moteurs de stockage.
See Section 14.2.6, « Syntaxe de CREATE TABLE ».
La raison pour accepter mais ignorer ces clauses est que cela renforce la
compatibilité avec le code des autres serveurs SQL, et qu'il est possible de
créer des tables avec des références.
See Section 1.8.5, « Différences entre MySQL et le standard SQL-92 ».
Depuis MySQL 4.0.13, InnoDB supporte l'utilisation de
ALTER TABLE pour effacer des clés étrangères :
ALTER TABLE yourtablename
DROP FOREIGN KEY fk_symbol
Pour plus d'informations, voyez
Section 16.7.4, « Contraintes de clés étrangères FOREIGN KEY ».
ALTER TABLE ignore les options de tables DATA DIRECTORY et
INDEX DIRECTORY.
Depuis MySQL 4.1.2,
si vous voulez changer dans toutes les colonnes de texte (CHAR, VARCHAR,
TEXT) le jeu de caractères, vous pouvez utiliser la commande suivante :
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;
C'est pratique lorsque vous passez de MySQL 4.0.x en 4.1.x. See Section 11.10, « Préparer le passage de version 4.0 en 4.1 ».
Attention : l'opération précédente va convertir les valeurs des colonnes
entre les deux jeux de caractères. Ce n'est pas ce que vous souhaitez faire
si une colonne est de type latin1 mais que les valeurs sont en fait dans un
autre jeu de caractères (comme utf8). Dans ce cas, vous devez faire ceci
avec une telle colonne :
ALTER TABLE t1 CHANGE c1 c1 BLOB; ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;
La raison est que dans ce cas, il n'y aura pas de conversion lorsque
vous passer en type BLOB.
Pour ne changer que le type de caractères par défaut, utilisez cette commande :
ALTER TABLE tbl_name DEFAULT CHARACTER SET charset_name;
Le mot DEFAULT est optionnel.
Le jeu de caractères par défaut est utilisé si vous ne spécifiez pas le jeu de
caractères de la colonne explicitement, lorsque vous ajoutez une nouvelle colonne :
par exemple, avec ALTER TABLE ... ADD column.
Attention : depuis MySQL 4.1.2 et plus récent,
ALTER TABLE ... DEFAULT CHARACTER SET et
ALTER TABLE ... CHARACTER SET sont équivalent et ne changent que le
jeu de caractères par défaut. Dans les versions antérieures à MySQL 4.1.2,
ALTER TABLE ... DEFAULT CHARACTER SET changeait le jeu de caractères par
défaut, mais ALTER TABLE ... CHARACTER SET (sans DEFAULT)
changeait le jeu de caractères par défaut, et convertissaient les colonnes
dans le nouveau jeu.
Pour une table InnoDB qui a été créée avec son propre espace de tables
dans un fichier .ibd, ce fichier peut être supprimé et importé. Pour
supprimer le fichier .ibd, utilisez la commande suivante :
ALTER TABLE tbl_name DISCARD TABLESPACE;
Elle efface le fichier .ibd courant, alors assurez vous que vous avez une copie
de sauvegarde. Si vous tentez d'accéder à un espace de table sans ce fichier,
vous obtiendrez une erreur.
Pour importer un fichier de sauvegarde .ibd dans la table, copiez le nouveau
fichier dans le dossier de la base, et utilisez cette commande :
ALTER TABLE tbl_name IMPORT TABLESPACE;
See Section 16.7.6, « Espaces de tables multiples : chaque table InnoDB a son fichier .ibd ».
Avec la fonction mysql_info() de l'API C, vous pouvez savoir combien
d'enregistrements ont été copiés, et (quand IGNORE est spécifié) combien
d'enregistrements ont été effacés à cause de la clef unique.
See Section 21.2.3.30, « mysql_info() ».
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.
See Section 14.5.3.1, « 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.
© 1995-2005 MySQL AB. All rights reserved.
