Справочное руководство по MySQL не дает четкого примера того, как это сделать.
У меня есть столбец с названиями стран в формате ENUM, к которому нужно добавить больше стран. Какой правильный синтаксис MySQL для этого?
Вот моя попытка:
ALTER TABLE carmake CHANGE country country ENUM('Sweden','Malaysia');
Я получаю ошибку: ERROR 1265 (01000): Data truncated for column 'country' at row 1.
country
Столбец является ENUM-типа в вышеприведенном заявлении.
ПОКАЗАТЬ СОЗДАТЬ ТАБЛИЦУ ВЫХОД:
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)
ВЫБЕРИТЕ РАЗЛИЧНУЮ страну ОТ АВТОМОБИЛЬНОГО ВЫХОДА:
+----------------+
| country |
+----------------+
| Italy |
| Germany |
| England |
| USA |
| France |
| South Korea |
| NULL |
| Australia |
| Spain |
| Czech Republic |
+----------------+
mysql
enums
alter-table
Зайд
источник
источник
inplace
начиная с 10.3.7: mariadb.com/kb/en/library/…Ваш код работает для меня. Вот мой тестовый пример:
Какую ошибку вы видите?
FWIW это также будет работать:
Я бы порекомендовал таблицу стран, а не столбец enum. У вас могут быть сотни стран, которые могут составить довольно большой и неуклюжий список.
РЕДАКТИРОВАТЬ: Теперь, когда я вижу ваше сообщение об ошибке:
Я подозреваю, что у вас есть некоторые значения в столбце вашей страны, которые не отображаются в вашем
ENUM
. Каков вывод следующей команды?ДРУГОЕ РЕДАКТИРОВАНИЕ: Каковы выходные данные следующей команды?
Это
STRICT_TRANS_TABLES
илиSTRICT_ALL_TABLES
? Это может привести к ошибке, а не к обычному предупреждению, которое MySQL даст вам в этой ситуации.ЕЩЕ ДРУГОЕ РЕДАКТИРОВАНИЕ: Хорошо, теперь я вижу, что у вас определенно есть значения в таблице, которых нет в новом
ENUM
. НовоеENUM
определение позволяет только'Sweden'
и'Malaysia'
. В таблице есть'USA'
,'India'
и некоторые другие.ПОСЛЕДНИЕ РЕДАКТИРОВАТЬ (МОЖЕТ): Я думаю, что вы пытаетесь сделать это:
источник
carmake
таблице более одного столбца . Может ли это иметь какое-либо отношение к этому?Обсуждение я имел с Асафа может быть нечетким , чтобы следовать , как мы пошли вперед и назад совсем немного.
Я подумал, что мог бы прояснить исход нашей беседы для тех, кто может столкнуться с подобными ситуациями в будущем, чтобы извлечь выгоду из:
ENUM
колоннами очень сложно управлять животными. Я хотел добавить две страны (Малайзия и Швеция) к существующему набору стран в моем ENUM.Кажется, что MySQL 5.1 (что я и запускаю) может обновлять ENUM только путем переопределения существующего набора в дополнение к тому, что я хочу:
Это не сработало:
Причина заключалась в том , что заявление MySQL было заменить существующий ENUM с другой , содержащими записи
'Malaysia'
и'Sweden'
только. MySQL бросил ошибку , потому чтоcarmake
таблица уже была ценности , как'England'
и'USA'
которые не являются частью новогоENUM
определения «s.Удивительно, но и следующее не сработало:
Получается, что даже порядок элементов существующих
ENUM
должен быть сохранен при добавлении в него новых членов. Так что, если мой существующийENUM
выглядит примерно такENUM('England','USA')
, то мой новыйENUM
должен быть определен какENUM('England','USA','Sweden','Malaysia')
и нетENUM('USA','England','Sweden','Malaysia')
. Эта проблема проявляется только тогда, когда в существующей таблице есть записи, которые используют'USA'
или'England'
значения.НИЖНЯЯ ГРАНИЦА:
Используйте
ENUM
s только тогда, когда вы не ожидаете, что ваш набор членов изменится после определения. В противном случае таблицы поиска гораздо проще обновлять и модифицировать.источник
В версии сервера MYSQL: 5.0.27 я попробовал это, и он работал нормально для меня, проверьте вашу версию
источник
К сведению: полезный инструмент моделирования - phpMyAdmin с Wampserver 3.0.6 - Предварительный просмотр SQL: я использую «Предварительный просмотр SQL», чтобы увидеть код SQL, который будет сгенерирован перед сохранением столбца с изменением на ENUM. Предварительный просмотр SQL
Выше вы видите, что я ввел 'Ford', 'Toyota' в ENUM, но я получаю синтаксис ENUM (0), который генерирует синтаксическую ошибку Query error 1064 #
Затем я копирую, вставляю и изменяю SQL и запускаю его через SQL с положительным результатом.
SQL изменен
Это быстрое исправление, которое я часто использую, и его также можно использовать с существующими значениями ENUM, которые необходимо изменить. Думаю, это может быть полезно.
источник
Вот еще один способ ...
Он добавляет «другие» к определению перечисления столбца «rtipo» таблицы «firmas».
источник
Это возможно, если вы верите. Хехе. попробуйте этот код.
Перед добавлением нового значения
После добавления нового значения
источник