Comment déplacer des colonnes dans une table MySQL?

207

Actuellement, j'ai la table MySQL suivante: Employees (empID, empName, department);

Je souhaite modifier le tableau comme suit: Employees (empID, department, empName);

Comment cela peut-il être fait en utilisant des ALTERinstructions?

Remarque: je souhaite modifier uniquement les positions des colonnes.

sumit
la source
Puis-je demander pourquoi? L'ordre des colonnes est à peu près juste un problème esthétique ...
deceze
6
@deceze peut-être pas - il définit l'ordre des valeurs dans une SELECT *instruction. (Certes, si l'ordre des valeurs est important, il faut les énumérer explicitement dans l'instruction, mais peut-être qu'OP n'a pas un contrôle total ici.)
Ted Hopp
1
Je sais que cela n'affecte rien. Ma table d'origine comporte de nombreuses colonnes, je viens donc d'ajouter 3 colonnes qui sont ajoutées dans la dernière. Mais je veux qu'ils s'affichent aux positions 3-4-5 pour faciliter l'utilisation de l' SELECTinstruction
sumit
6
@iSumitG: Notez également que le AFTER columnpeut également être utilisé avec ALTER TABLE ADD column. (pour la prochaine fois, vous ajouterez des champs.)
ypercubeᵀᴹ
2
Si vous chargez un vidage mysql, il utilise insert dans les valeurs. Par exemple, si vous chargez des données de prod dans dev et que les colonnes sont en panne, vous obtiendrez une erreur. C'est pourquoi on peut vouloir faire ça.
Hooray Im Helping

Réponses:

345

Si empName est une colonne VARCHAR (50):

ALTER TABLE Employees MODIFY COLUMN empName VARCHAR(50) AFTER department;

ÉDITER

Selon les commentaires, vous pouvez également le faire:

ALTER TABLE Employees CHANGE COLUMN empName empName VARCHAR(50) AFTER department;

Notez que la répétition de empNameest délibérée. Vous devez dire à MySQL que vous souhaitez conserver le même nom de colonne.

Vous devez savoir que les deux versions de syntaxe sont spécifiques à MySQL. Ils ne fonctionneront pas, par exemple, dans PostgreSQL ou dans de nombreux autres SGBD.

Autre modification: comme l'a souligné @Luis Rossi dans un commentaire, vous devez spécifier complètement la définition de colonne modifiée juste avant le AFTERmodificateur. Les exemples ci-dessus ont juste VARCHAR(50), mais si vous avez besoin d'autres caractéristiques (comme NOT NULLou une valeur par défaut), vous devez également les inclure. Consultez la documentation surALTER TABLE pour plus d'informations.

Ted Hopp
la source
6
Juste une note: MODIFY n'est pas pris en charge avant la version 4.
Erre Efe
4
Vous devez répéter le nom de la colonne, car la syntaxe suppose que vous souhaiterez peut-être modifier le nom de la colonne. Ex: ALTER TABLE Employés CHANGER LA COLONNE empName empName varchar (50) APRÈS département;
brianjcohen
Gardez à l'esprit que l'ordre modifié ne sera pas reflété dans les vidages SQL de la base de données.
skalee
3
@SalehEnamShohag - Oui, selon la documentation , le COLUMNmot-clé est facultatif dans les ALTER TABLEinstructions. Je préfère l'utiliser car je pense que cela rend la déclaration plus lisible.
Ted Hopp
1
Fonctionne bien pour moi, dans mon cas, j'avais besoin de définir que la colonne était NOT NULL DEFAULT 1, cela se fait juste après le type de colonne dans l'exempleVARCHAR(50)
Luiz Rossi
67

Modifier la position de la colonne:

ALTER TABLE Employees 
   CHANGE empName empName VARCHAR(50) NOT NULL AFTER department;

Si vous devez le déplacer vers la première position, vous devez utiliser le terme PREMIER à la fin de la requête ALTER TABLE CHANGE [COLUMN]:

ALTER TABLE UserOrder 
   CHANGE order_id order_id INT(11) NOT NULL FIRST;
Igor Kostin
la source
24
Mentionner comment le déplacer en première position était très utile
Tristian
2
Une idée de la façon dont cela se produirait sur une grande table? Change-t-il simplement certaines métadonnées ou doit-il réellement réorganiser les données sur le disque?
Kip
6
peu importe, a répondu à ma propre question en l'essayant sur une table que j'avais avec 3,9 millions de lignes, cela a pris environ 2 minutes. il fait donc bien plus que simplement échanger des métadonnées.
Kip
14

phpMyAdmin fournit une interface graphique pour cela dans la vue de la structure d'une table. Cochez pour sélectionner la colonne que vous souhaitez déplacer et cliquez sur l'action de modification en bas de la liste des colonnes. Vous pouvez ensuite modifier toutes les propriétés de la colonne et vous trouverez la fonction «déplacer la colonne» à l'extrême droite de l'écran.

Bien sûr, tout cela ne fait que construire les requêtes dans la bonne réponse parfaite, mais les fans de l'interface graphique pourraient apprécier l'alternative.

ma version de phpMyAdmin est 4.1.7


la source
1
La question demande spécifiquement "Comment cela peut-il être fait en utilisant des instructions ALTER". Tous ceux qui exécutent MySQL n'utilisent pas phpMyAdmin.
Caleb
3
J'apprends une grande partie de ce que je fais de nos jours sur une ligne de commande en observant la sortie de la requête à partir d'outils GUI comme phpMyAdmin. Je suis heureux que ce post reçoive autant de votes négatifs que les personnes le jugent bon sur cette base: 1 personne le verra, fera son travail dans un environnement dans lequel il se sent à l'aise, apprend un peu et passe à autre chose.
pour cette action, phpmyadmi n'affiche pas la commande effectuant l'action. Pas trouvé
Tebe
2
Wow, tellement de colère pour une solution alternative qui fait l'affaire et complète les réponses que l'OP a demandé pour un ALTER SQL.
Ewen
1

J'ai dû exécuter cela pour une colonne introduite dans les dernières étapes d'un produit, sur 10+ tables. Il a donc écrit ce script rapide et désordonné pour générer la commande alter pour toutes les tables «pertinentes».

SET @NeighboringColumn = '<YOUR COLUMN SHOULD COME AFTER THIS COLUMN>';

SELECT CONCAT("ALTER TABLE `",t.TABLE_NAME,"` CHANGE COLUMN `",COLUMN_NAME,"` 
`",COLUMN_NAME,"` ", c.DATA_TYPE, CASE WHEN c.CHARACTER_MAXIMUM_LENGTH IS NOT 
NULL THEN CONCAT("(", c.CHARACTER_MAXIMUM_LENGTH, ")") ELSE "" END ,"  AFTER 
`",@NeighboringColumn,"`;")
FROM information_schema.COLUMNS c, information_schema.TABLES t
WHERE c.TABLE_SCHEMA = '<YOUR SCHEMA NAME>'
AND c.COLUMN_NAME = '<COLUMN TO MOVE>'
AND c.TABLE_SCHEMA = t.TABLE_SCHEMA
AND c.TABLE_NAME = t.TABLE_NAME
AND t.TABLE_TYPE = 'BASE TABLE'
AND @NeighboringColumn IN (SELECT COLUMN_NAME 
    FROM information_schema.COLUMNS c2 
    WHERE c2.TABLE_NAME = t.TABLE_NAME);
uchamp
la source