Le manuel de référence MySQL ne fournit pas d'exemple clair sur la façon de procéder.
J'ai une colonne de type ENUM de noms de pays auxquels je dois ajouter plus de pays. Quelle est la syntaxe MySQL correcte pour y parvenir?
Voici ma tentative:
ALTER TABLE carmake CHANGE country country ENUM('Sweden','Malaysia');
L'erreur que j'obtiens est: ERROR 1265 (01000): Data truncated for column 'country' at row 1.
La country
colonne est la colonne de type ENUM dans l'instruction ci-dessus.
AFFICHER LA SORTIE CRÉER LA TABLE :
mysql> SHOW CREATE TABLE carmake;
+---------+---------------------------------------------------------------------+
| Table | Create Table
+---------+---------------------------------------------------------------------+
| carmake | CREATE TABLE `carmake` (
`carmake_id` tinyint(4) NOT NULL AUTO_INCREMENT,
`name` tinytext,
`country` enum('Japan','USA','England','Australia','Germany','France','Italy','Spain','Czech Republic','China','South Korea','India') DEFAULT NULL,
PRIMARY KEY (`carmake_id`),
KEY `name` (`name`(3))
) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=latin1 |
+---------+---------------------------------------------------------------------+
1 row in set (0.00 sec)
CHOISISSEZ DISTINCT le pays DE LA SORTIE carmake
+----------------+
| country |
+----------------+
| Italy |
| Germany |
| England |
| USA |
| France |
| South Korea |
| NULL |
| Australia |
| Spain |
| Czech Republic |
+----------------+
mysql
enums
alter-table
Zaid
la source
la source
inplace
depuis le 10.3.7: mariadb.com/kb/en/library/…Votre code fonctionne pour moi. Voici mon cas de test:
Quelle erreur voyez-vous?
FWIW cela fonctionnerait également:
Je recommanderais en fait une table de pays plutôt qu'une colonne enum. Il se peut que vous ayez des centaines de pays, ce qui constituerait une énumération assez importante et maladroite.
EDIT: Maintenant que je peux voir votre message d'erreur:
Je soupçonne que vous avez des valeurs dans la colonne de votre pays qui n'apparaissent pas dans votre
ENUM
. Quelle est la sortie de la commande suivante?UNE AUTRE MODIFICATION: Quelle est la sortie de la commande suivante?
Est-ce
STRICT_TRANS_TABLES
ouSTRICT_ALL_TABLES
? Cela pourrait entraîner une erreur, plutôt que l'avertissement habituel que MySQL vous donnerait dans cette situation.ENCORE UNE AUTRE MODIFICATION: Ok, je vois maintenant que vous avez certainement des valeurs dans le tableau qui ne sont pas dans le nouveau
ENUM
. La nouvelleENUM
définition autorise uniquement'Sweden'
et'Malaysia'
. La table a'USA'
,'India'
et plusieurs autres.DERNIÈRE MODIFICATION (PEUT-ÊTRE): Je pense que vous essayez de faire ceci:
la source
carmake
tableau. Cela pourrait-il avoir quelque chose à voir avec cela?La discussion que j'ai eue avec Asaph n'est peut-être pas claire à suivre, car nous nous sommes allés un peu en arrière.
J'ai pensé que je pourrais clarifier le résultat de notre discours pour que d'autres qui pourraient faire face à des situations similaires à l'avenir bénéficient de:
ENUM
Les colonnes de type -type sont des bêtes très difficiles à manipuler. Je voulais ajouter deux pays (Malaisie et Suède) à l'ensemble de pays existant dans mon ENUM.Il semble que MySQL 5.1 (qui est ce que j'utilise) ne peut mettre à jour l'ENUM qu'en redéfinissant l'ensemble existant en plus de ce que je veux:
Cela n'a pas fonctionné:
La raison en était que l'instruction MySQL remplaçait l'ENUM existant par un autre contenant les entrées
'Malaysia'
et'Sweden'
uniquement. MySQL a renvoyé une erreur car lacarmake
table avait déjà des valeurs comme'England'
et'USA'
qui ne faisaient pas partie de la nouvelleENUM
définition.Étonnamment, ce qui suit n'a pas fonctionné non plus:
Il s'avère que même l'ordre des éléments de l'existant
ENUM
doit être préservé tout en y ajoutant de nouveaux membres. Donc, si mon existantENUM
ressemble à quelque choseENUM('England','USA')
, alors mon nouveauENUM
doit être défini commeENUM('England','USA','Sweden','Malaysia')
et nonENUM('USA','England','Sweden','Malaysia')
. Ce problème ne devient manifeste que lorsqu'il existe des enregistrements dans la table existante qui utilisent'USA'
ou des'England'
valeurs.LIGNE INFERIEURE:
N'utilisez
ENUM
s que lorsque vous ne vous attendez pas à ce que votre ensemble de membres change une fois défini. Sinon, les tables de consultation sont beaucoup plus faciles à mettre à jour et à modifier.la source
Dans la version du serveur MYSQL: 5.0.27, j'ai essayé cela et cela a bien fonctionné pour moi, vérifiez votre version
la source
FYI: Un outil de simulation utile - phpMyAdmin avec Wampserver 3.0.6 - Preview SQL: J'utilise 'Preview SQL' pour voir le code SQL qui serait généré avant d'enregistrer la colonne avec le changement en ENUM. Aperçu SQL
Ci-dessus, vous voyez que j'ai entré 'Ford', 'Toyota' dans ENUM mais j'obtiens la syntaxe ENUM (0) qui génère une erreur de syntaxe Erreur de requête 1064 #
Ensuite, je copie et colle et modifie le SQL et l'exécute via SQL avec un résultat positif.
SQL changé
C'est un correctif rapide que j'utilise souvent et qui peut également être utilisé sur les valeurs ENUM existantes qui doivent être modifiées. J'ai pensé que cela pourrait être utile.
la source
Voici une autre façon ...
Il ajoute "autres" à la définition enum de la colonne "rtipo" de la table "firmas".
la source
C'est possible si vous croyez. Hehe. essayez ce code.
Avant d'ajouter une nouvelle valeur
Après avoir ajouté une nouvelle valeur
la source