230 votes

Comment puis-je ajouter d'autres membres de mon ENUM type de colonne dans MySQL?

Le manuel de référence de MySQL ne fournit pas un clair exemple sur la façon de le faire.

J'ai un ENUM type de la colonne des noms de pays que j'ai besoin d'ajouter plus de pays. Quelle est la bonne syntaxe de MySQL 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.

L' country colonne est l'ENUM type dans la colonne ci-dessus énoncé.

SHOW CREATE TABLE EN SORTIE:

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)

SELECT DISTINCT pays DE carmake de SORTIE:

+----------------+
| country        |
+----------------+
| Italy          |
| Germany        |
| England        |
| USA            |
| France         |
| South Korea    |
| NULL           |
| Australia      |
| Spain          |
| Czech Republic |
+----------------+

110voto

Asaph Points 56989

Votre code fonctionne pour moi. Voici mon cas de test:

mysql> CREATE TABLE carmake (country ENUM('Canada', 'United States'));
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW CREATE TABLE carmake;
+---------+-------------------------------------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                                            |
+---------+-------------------------------------------------------------------------------------------------------------------------+
| carmake | CREATE TABLE `carmake` (
  `country` enum('Canada','United States') default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+---------+-------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> ALTER TABLE carmake CHANGE country country ENUM('Sweden','Malaysia');
Query OK, 0 rows affected (0.53 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW CREATE TABLE carmake;
+---------+--------------------------------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                                       |
+---------+--------------------------------------------------------------------------------------------------------------------+
| carmake | CREATE TABLE `carmake` (
  `country` enum('Sweden','Malaysia') default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+---------+--------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Quelle erreur avez-vous observé?

FWIW ce serait également le travail:

ALTER TABLE carmake MODIFY COLUMN country ENUM('Sweden','Malaysia');

En fait, je peux vous recommander un tableau par pays plutôt que d'enum colonne. Vous pouvez avoir des centaines de pays, ce qui serait une assez grand et maladroit enum.

EDIT: Maintenant que je peux voir votre message d'erreur:

ERROR 1265 (01000): Data truncated for column 'country' at row 1.

Je soupçonne que vous avez quelques valeurs dans votre pays colonne qui n'apparaissent pas dans votre ENUM. Qu'est-ce que la sortie de la commande suivante?

SELECT DISTINCT country FROM carmake;

Un AUTRE EDIT: qu'est-Ce que la sortie de la commande suivante?

SHOW VARIABLES LIKE 'sql_mode';

Est-il STRICT_TRANS_TABLES ou STRICT_ALL_TABLES? Qui pourrait conduire à une erreur, plutôt que l'habituel avertissement MySQL serait de vous donner dans cette situation.

ENCORE un AUTRE EDIT: Ok, je vois maintenant que vous avez certainement des valeurs dans la table qui ne sont pas dans le nouveau ENUM. Le nouveau ENUM définition permet seulement d' 'Sweden' et 'Malaysia'. La table a 'USA', 'India' et plusieurs autres.

DERNIÈRE modification (PEUT-être): je pense que vous essayez de faire ceci:

ALTER TABLE carmake CHANGE country country ENUM('Italy', 'Germany', 'England', 'USA', 'France', 'South Korea', 'Australia', 'Spain', 'Czech Republic', 'Sweden', 'Malaysia') DEFAULT NULL;

78voto

Zaid Points 21192

La discussion que j'ai eu avec Asaph peut-être pas clair à suivre, que nous sommes allés en arrière un peu.

J'ai pensé que je pourrais clarifier le résultat de notre discours, pour d'autres qui pourraient faire face à des situations similaires à l'avenir, de bénéficier de:

ENUM-type des colonnes sont très difficiles bêtes à manipuler. Je voulais ajouter deux pays (Malaisie Et la Suède) pour l'ensemble des pays dans mon ENUM.

Il semble que MySQL 5.1 (qui est ce que je suis en cours d'exécution) peut uniquement mettre à jour les ENUM par la redéfinition de l'ensemble existant en plus de ce que je veux:

Cela ne fonctionne pas:

ALTER TABLE carmake CHANGE country country ENUM('Sweden','Malaysia') DEFAULT NULL;

La raison en était que le MySQL déclaration a été le remplacement de l'existant ENUM avec un autre contenant les entrées 'Malaysia' et 'Sweden' seulement. MySQL a jeté une erreur car l' carmake tableau déjà eu des valeurs comme l' 'England' et 'USA' qui ne faisaient pas partie de la nouvelle - ENUMs'définition.

Étonnamment, le suivant ne fonctionne pas:

ALTER TABLE carmake CHANGE country country ENUM('Australia','England','USA'...'Sweden','Malaysia') DEFAULT NULL;

Il s'avère que même l'ordre des éléments de l'existant, ENUM doit être préservé lors de l'ajout de nouveaux membres. Donc, si mon existants ENUM ressemble ENUM('England','USA'), alors mon nouveau ENUM doit être défini comme l' ENUM('England','USA','Sweden','Malaysia') et pas ENUM('USA','England','Sweden','Malaysia'). Ce problème ne se manifeste quand il y a des enregistrements dans la table existante qui utilisent 'USA' ou 'England' valeurs.

BAS DE LIGNE:

Utilisez uniquement ENUMs quand vous ne vous attendez pas votre ensemble de membres à changer une fois défini. Sinon, les tables de recherche sont beaucoup plus faciles à mettre à jour et modifier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X