Ajouter plusieurs colonnes APRÈS une colonne spécifique dans MySQL


362

Je dois ajouter plusieurs colonnes à une table mais positionner les colonnes après une colonne appelée lastname.

J'ai essayé ceci:

ALTER TABLE `users` ADD COLUMN
(
    `count` smallint(6) NOT NULL,
    `log` varchar(12) NOT NULL,
    `status` int(10) unsigned NOT NULL
) 
AFTER `lastname`;

Je reçois cette erreur:

Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à la version de votre serveur MySQL pour la bonne syntaxe à utiliser près de ') APRÈS lastname' à la ligne 7


Comment puis-je utiliser AFTER dans une requête comme celle-ci?


5
De quel dialecte parlez-vous? Cela me ressemble à mysql. Mais la ALTER TABLEsyntaxe varie un peu entre les dialectes.
Damien_The_Unbeliever


1
Je pense que vous avez besoin d'un mot clé AFTER sur chacune des colonnes que vous ajoutez. Que cela signifie que vous avez besoin des 3 pour être APRES le nom de famille ou d'une instruction ALTER TABLE distincte par nouvelle colonne, je ne peux pas le dire avec certitude.
Zec

Réponses:


729

Essaye ça

ALTER TABLE users
ADD COLUMN `count` SMALLINT(6) NOT NULL AFTER `lastname`,
ADD COLUMN `log` VARCHAR(12) NOT NULL AFTER `count`,
ADD COLUMN `status` INT(10) UNSIGNED NOT NULL AFTER `log`;

vérifier la syntaxe


6
[ À titre d'information supplémentaire ] Multiple ADD, ALTER, DROPet les CHANGEclauses sont autorisés dans une seule ALTER TABLEdéclaration, séparés par des virgules. Il s'agit d'une extension MySQL de SQL standard, qui autorise une seule de chaque clause par instruction ALTER TABLE.
informatik01

@Ayyappan Pouvons-nous faire cela dans un serveur SQL?
Roshan

77

Si vous souhaitez ajouter une seule colonne après un champ spécifique, la requête MySQL suivante devrait fonctionner:

ALTER TABLE users
    ADD COLUMN count SMALLINT(6) NOT NULL
    AFTER lastname

Si vous souhaitez ajouter plusieurs colonnes, vous devez utiliser la commande 'ADD' à chaque fois pour une colonne. Voici la requête MySQL pour cela:

ALTER TABLE users
    ADD COLUMN count SMALLINT(6) NOT NULL,
    ADD COLUMN log VARCHAR(12) NOT NULL,
    ADD COLUMN status INT(10) UNSIGNED NOT NULL
    AFTER lastname

À noter

Dans la deuxième méthode, la dernière ADD COLUMN colonne doit en fait être la première colonne que vous souhaitez ajouter au tableau.

Par exemple: si vous voulez ajouter count, log, statusdans l'ordre exact après lastname, la syntaxe serait en fait:

ALTER TABLE users
    ADD COLUMN log VARCHAR(12) NOT NULL AFTER lastname,
    ADD COLUMN status INT(10) UNSIGNED NOT NULL AFTER lastname,
    ADD COLUMN count SMALLINT(6) NOT NULL AFTER lastname

3
La deuxième version a parfaitement fonctionné pour moi. J'utilise MySql 5.5.25.
Norman

ne le dernier morceau de code ajouter les colonnes dans l'ordre count, log, statusou count, status, log?
Sarfaraaz

1
Remarque: si vous n'ajoutez pas le bit 'AFTER lastname', alors l'ordre dans lequel la dernière colonne que vous mettez dans cette liste de tables de modification vient en premier ne s'applique pas vraiment. Ainsi, lorsque vous effectuez ALTER TABLE table ADD COLUMN blah1, ADD COLUMN blah2; (notez la clause 'AFTER'), la colonne blah1 sera ajoutée en premier, puis blah2.
Hongyi Li

10

Vous ne pouvez pas mentionner plusieurs noms de colonne avec des virgules à l'aide de ADD COLUMN. Vous devez mentionner ADD COLUMNchaque fois que vous définissez une nouvelle colonne.


4
J'ai donné un +1 mais cela devrait être un commentaire à la réponse acceptée
mjsarfatti

9

Celui-ci est correct:

ALTER TABLE `users`
    ADD COLUMN `count` SMALLINT(6) NOT NULL AFTER `lastname`,
    ADD COLUMN `log` VARCHAR(12) NOT NULL AFTER `count`,
    ADD COLUMN `status` INT(10) UNSIGNED NOT NULL AFTER `log`;

3
ALTER TABLE `users` ADD COLUMN
`COLUMN NAME` DATATYPE(SIZE) AFTER `EXISTING COLUMN NAME`;

Vous pouvez le faire avec ça, ça marche bien pour moi.


1

Une possibilité serait de ne pas se soucier de réorganiser les colonnes dans le tableau et de simplement le modifier en ajoutant les colonnes. Ensuite, créez une vue qui a les colonnes dans l'ordre souhaité - en supposant que l'ordre est vraiment important. La vue peut être facilement modifiée pour refléter toute commande que vous souhaitez. Comme je ne peux pas imaginer que l'ordre serait important pour les applications programmatiques, la vue devrait suffire pour les requêtes manuelles où elle pourrait être importante.


4
si je peux ajouter mes deux cents, le "placement", qu'il s'agisse de colonnes ou de lignes de table, devrait être sans importance. Les feuilles de calcul utilisent l'emplacement pour trouver des choses, pas les bases de données.
Mike S.

1

ALTER TABLE listingADD countINT (5), ADD logVARCHAR (200), ADD statusVARCHAR (20) APRÈS stat

Cela donnera de bons résultats.


0

Cela fonctionne bien pour moi:

ALTER TABLE 'users'
ADD COLUMN 'count' SMALLINT(6) NOT NULL AFTER 'lastname',
ADD COLUMN 'log' VARCHAR(12) NOT NULL AFTER 'count',
ADD COLUMN 'status' INT(10) UNSIGNED NOT NULL AFTER 'log';

Voler un commentaire pour obtenir des votes. Ne fais pas ce compagnon.
MBouwman

0

La solution qui a fonctionné pour moi avec la valeur par défaut 0 est la suivante

ALTER TABLE reservations ADD COLUMN isGuest BIT DEFAULT 0

0

Alternativement:

ALTER TABLE users
ADD COLUMN `status` INT(10) UNSIGNED NOT NULL AFTER `lastname`,
ADD COLUMN `log` VARCHAR(12) NOT NULL AFTER `lastname`,
ADD COLUMN `count` SMALLINT(6) NOT NULL AFTER `lastname`;

Les mettra dans l'ordre que vous souhaitez tout en rationalisant l'instruction AFTER.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.