Services webmasters
Partenaires
Jeux concours gratuits
 
Syntaxe de CREATE TABLE
<<<
Syntaxe de ALTER TABLE Syntaxe de RENAME TABLE
>>>

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 .

  • 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. 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 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 Syntaxe de CREATE TABLE .
  • DROP INDEX supprime un index. C'est une extension MySQL à la norme ANSI SQL92. 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 de MySQL, 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.
  • 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é éffacés à cause de la clef unique.
  • Les clauses FOREIGN KEY , CHECK , et REFERENCES ne font rien pour le moment, à part pour les tables InnoDB qui supportent la commande ADD CONSTRAINT FOREIGN KEY (...) REFERENCES ... (...) . Notez que InnoDB ne permet pas la spécification de nom_index . Tables InnoDB . La syntaxe pour les autres types de tables est fournie pour assurer la compatibilité, rendre le port du code à partir d'autres serveurs SQL plus facile et faire fonctionner les applications qui créent des tables avec des références. Différences entre MySQL et ANSI SQL92 .
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 . .

<< Syntaxe de ALTER TABLE >>
Syntaxe de CREATE TABLE Définition de données : CREATE , DROP , ALTER Syntaxe de RENAME TABLE
Services webmasters
Les manuels
 
CoursPHP.com - Reproduction interdite -