Document ID: /fineweb-2-swissfilter-quality_10-filterrobots/filtered/07135.jsonl.gz/65

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.
- Pour pouvoir utiliser la commande
ALTER TABLE, il faut avoir les droits pour select, insert, delete, update, create et drop sur la table.
IGNORE est une extension MySQL de la norme ANSI SQL92. Il permet de contrôler la façon avec laquelle réagit si il trouve des doublons dans une colonne de clés uniques. Si n'est pas précisé, la copie est annulée à la première erreur, et la modification est annulée. Si est précisé, alors la première occurrence d'une clés en double sera utilisée, les autres occurrences étant ignorées et effacées.
- Il est possible d'utiliser plusieurs clauses
ADD,
ALTER,
DROP et
CHANGE dans une commande
ALTER TABLE. C'est une extension de MySQL à la norme ANSI SQL92 : cette dernière ne permet qu'une seule de ces clauses à chaque commande.
CHANGE Nom_col,
DROP Nom_col et
DROP INDEX sont des extensions de MySQL à la norme ANSI SQL92
CHANGE Nom_col,
DROP Nom_col et
DROP INDEX sont des extensions de MySQL à la norme ANSI SQL92 .
MODIFY est une extension Oracle à
ALTER TABLE.
- L'option
COLUMN est simplement de la décoration et peut être ignoré.
- La commande ''
ALTER TABLE Nom_table RENAME AS new_name '' sans aucune autre option, permet de renommer la table. MySQL va simplement renommer les fichiers correspondant à la table
Nom_table. Il n'y a pas de création de table temporaire.
- La clause
create_definition utilise la même syntaxe que les clauses
ADD et
CHANGE, ainsi que
CREATE TABLE. Cette inclus le nom de la colonne, et pas seulement le type de colonne. Voir
CREATE TABLE.
- La commande
CHANGE old_Nom_col create_definition permet de changer le nom d'une colonne. Pour cela, il faut spécifier l'ancien et le nouveau nom de la colonne, ainsi que le type courant de la colonne. Par exemple, pour renommer une colonne de type
INTEGER de 'a' en 'b', la commande suivante est valable :
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;
- Lors de l'utilisation de
CHANGE ou
MODIFY pour réduire la taille d'une colonne qui possède un index (par exemple, un index sur les 10 premiers caractères d'une colonne de type
VARCHAR ), il est impossible de rendre la colonne plus petite que ne le requiert l'index.
- En changeant le type d'une colonne avec
CHANGE ou
MODIFY, MySQL essaie de convertir au mieux les informations d'un type à l'autre.
- A partir de MySQL 3.22, il est possible d'utiliser
FIRST ou
ADD ... AFTER Nom_col pour ajouter une colonne à une position donnée, dans une table. Par défaut, l'ajout de fait après la dernière colonne.
ALTER COLUMN spécifie une nouvelle valeur par défaut, ou bien efface l'ancienne valeur. Si la valeur par défaut de la colonne est effacée, et que la colonne peut être
NULL, alors la nouvelle valeur par défaut est
NULL.Si la colonne ne peut pas être
NULL, alors MySQL assigne une valeur par défaut arbitraire, comme décrit dans le paragraphe
CREATE TABLE.
DROP INDEX efface un index. C'est une extension de MySQL à la norme ANSI SQL92 .
- Lorsqu'une colonne est effacée d'une table, la colonne est aussi effacée de toutes les index qui l'utilise. Si toutes les colonnes qui composent un index sont effacées, l'index disparaît aussi.
DROP PRIMARY KEY efface la colonne qui porte l'attribut
PRIMARY KEY . Si une telle colonne n'existe pas, la première colonne de type
UNIQUE est effacée à la place. (MySQL utilise la première colonne
UNIQUE comme
PRIMARY KEY si aucune
PRIMARY KEY n'est spécifiée.)
- Avec l'API C
mysql_info(), il est possible de savoir combien de ligne ont été copiée, et (quand l'option
IGNORE était mise), le nombre de lignes qui furent effacées, à cause de la duplication de clés.
-
- Les attributs
FOREIGN KEY,
CHECK et
REFERENCES ne font en réalité rien de spécial. Ils sont uniquement fournis pour assurer la compatibilité et la portabilité de programme SQL et de les faire tourner avec MySQL.
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.