Le manuel de référence de MySQL ne fournit pas d'exemple clair sur la façon de procéder.
J'ai une colonne de noms de pays de type ENUM à laquelle je dois ajouter d'autres 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 je reçois est: ERROR 1265 (01000): Data truncated for column 'country' at row 1.
La colonne country
est la colonne de type ENUM dans l'instruction ci-dessus.
MONTRER CREER TABLE 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)
CHOISISSEZ UN PAYS DISTINCT DE CARMAKE SORTIE:
+----------------+
| country |
+----------------+
| Italy |
| Germany |
| England |
| USA |
| France |
| South Korea |
| NULL |
| Australia |
| Spain |
| Czech Republic |
+----------------+
ALTER TABLE
`table_name`
MODIFY COLUMN
`column_name2` enum(
'existing_value1',
'existing_value2',
'new_value1',
'new_value2'
)
NOT NULL AFTER `column_name1`;
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 voyez-vous?
FWIW cela fonctionnerait aussi:
ALTER TABLE carmake MODIFY COLUMN country ENUM('Sweden','Malaysia');
En fait, je recommanderais une table de pays plutôt qu'une colonne enum. Vous avez peut-être des centaines de pays qui constitueraient un enum assez grand et maladroit.
EDIT: Maintenant que je peux voir votre message d'erreur:
ERROR 1265 (01000): Data truncated for column 'country' at row 1.
Je suppose que votre colonne pays contient des valeurs qui n'apparaissent pas dans votre ENUM
. Quelle est la sortie de la commande suivante?
SELECT DISTINCT country FROM carmake;
UN AUTRE ÉDIT: Quel est le résultat de la commande suivante?
SHOW VARIABLES LIKE 'sql_mode';
Est-ce STRICT_TRANS_TABLES
ou STRICT_ALL_TABLES
? Cela pourrait entraîner une erreur, plutôt que l’avertissement habituel que MySQL vous donnerait dans cette situation.
ENCORE UN AUTRE ÉDIT: Ok, je vois maintenant que vous avez certainement des valeurs dans le tableau qui ne sont pas dans la nouvelle ENUM
. La nouvelle définition ENUM
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:
ALTER TABLE carmake CHANGE country country ENUM('Italy', 'Germany', 'England', 'USA', 'France', 'South Korea', 'Australia', 'Spain', 'Czech Republic', 'Sweden', 'Malaysia') DEFAULT NULL;
La discussion que j'ai eu avec Asaph n'est peut-être pas claire à suivre car nous sommes allés beaucoup plus en arrière.
J'ai pensé que je pourrais clarifier le résultat de notre discours pour que d'autres qui pourraient être confrontés à des situations similaires à l'avenir bénéficient de:
Les colonnes de type ENUM
- 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 (ce que je lance) ne peut mettre à jour ENUM qu'en redéfinissant l'ensemble existant, en plus de ce que je veux:
Cela n'a pas fonctionné:
ALTER TABLE carmake CHANGE country country ENUM('Sweden','Malaysia') DEFAULT NULL;
La raison en était que l'instruction MySQL remplaçait l'ENUM existant par un autre contenant uniquement les entrées 'Malaysia'
et 'Sweden'
. MySQL a généré une erreur car la table carmake
avait déjà des valeurs telles que 'England'
et 'USA'
qui ne faisaient pas partie de la nouvelle définition de ENUM
.
Étonnamment, les éléments suivants ne fonctionnaient pas non plus:
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 la ENUM
existante doit être préservé lors de l'ajout de nouveaux membres. Donc, si ma ENUM
ressemble à quelque chose comme ENUM('England','USA')
, alors ma nouvelle ENUM
doit être définie comme étant ENUM('England','USA','Sweden','Malaysia')
et non ENUM('USA','England','Sweden','Malaysia')
. Ce problème ne devient manifeste que lorsque des enregistrements de la table existante utilisent les valeurs 'USA'
ou 'England'
.
LIGNE INFÉRIEURE:
Utilisez uniquement ENUM
s lorsque vous ne vous attendez pas à ce que votre ensemble de membres change une fois défini. Sinon, les tables de recherche sont beaucoup plus faciles à mettre à jour et à modifier.
Dans la version du serveur MYSQL: 5.0.27, j'ai essayé ceci et cela a bien fonctionné pour moi, vérifiez votre version
ALTER TABLE carmake
MODIFY `country` ENUM('Japan', 'USA', 'England', 'Australia', 'Germany', 'France', 'Italy', 'Spain', 'Czech Republic', 'China', 'South Korea', 'India', 'Sweden', 'Malaysia');
Voici un autre moyen ...
Il ajoute "autres" à la définition "enum" de la colonne "rtipo" de la table "firmas".
set @new_enum = 'others';
set @table_name = 'firmas';
set @column_name = 'rtipo';
select column_type into @tmp from information_schema.columns
where table_name = @table_name and column_name=@column_name;
set @tmp = insert(@tmp, instr(@tmp,')'), 0, concat(',\'', @new_enum, '\'') );
set @tmp = concat('alter table ', @table_name, ' modify ', @column_name, ' ', @tmp);
prepare stmt from @tmp;
execute stmt;
deallocate prepare stmt;
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 la modification apportée à ENUM. Preview SQL
Au-dessus de vous, 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, colle, modifie le code SQL et le exécute en mode SQL avec un résultat positif.
C’est un correctif que j’utilise souvent et qui peut également être utilisé sur des valeurs ENUM existantes qui doivent être modifiées. Pensé que cela pourrait être utile.