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 13.2.5, « 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 13.2.5.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 13.2.9, « 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 13.2.5, « 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 13.2.5, « Syntaxe de CREATE TABLE
».
DROP INDEX
supprime un index. C'est une
extension MySQL à la norme ANSI SQL92. See
Section 13.2.7, « 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 15.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 13.2.5, « 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.5.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 15.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 10.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 15.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 24.2.3.31, « 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 13.5.2.8, « 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.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.