it-roy-ru.com

Как добавить больше членов в мой столбец ENUM-типа в MySQL?

Справочное руководство по 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 |
+----------------+
130
Zaid
ALTER TABLE
    `table_name`
MODIFY COLUMN
    `column_name2` enum(
        'existing_value1',
        'existing_value2',
        'new_value1',
        'new_value2'
    )
NOT NULL AFTER `column_name1`;
83
Pradip Chongbang

Ваш код работает для меня. Вот мой тестовый пример:

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)

Какую ошибку вы видите?

FWIW это также будет работать:

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

Я бы порекомендовал таблицу стран, а не столбец enum. У вас могут быть сотни стран, которые могут составить довольно большой и неуклюжий список.

Правка: Теперь, когда я вижу ваше сообщение об ошибке:

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

Я подозреваю, что у вас есть некоторые значения в столбце вашей страны, которые не отображаются в вашей ENUM

ДРУГОЕ РЕДАКТИРОВАНИЕ: Каков вывод следующей команды?

SHOW VARIABLES LIKE 'sql_mode';

Это STRICT_TRANS_TABLES

93
Asaph

обсуждение у меня было с Асафом, может быть, неясно следовать, так как мы пошли туда-сюда довольно много.

Я подумал, что мог бы прояснить исход нашей беседы для тех, кто может столкнуться с подобными ситуациями в будущем, чтобы извлечь выгоду из:

Столбцы типа ENUM- очень трудно манипулировать животными. Я хотел добавить две страны (Малайзия и Швеция) к существующему набору стран в моем ENUM.

Кажется, что MySQL 5.1 (то, что я запускаю) может только обновить ENUM, переопределив существующий набор в дополнение к тому, что я хочу:

Это не сработало:

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

Причина была в том, что оператор MySQL заменял существующий ENUM другим, содержащим только записи 'Malaysia' и 'Sweden'. MySQL вызвала ошибку, потому что таблица carmake уже имела значения типа 'England' и 'USA', которые не были частью определения нового ENUM.

Удивительно, но и следующее не сработало:

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

Получается, что даже порядок элементов существующей ENUM должен быть сохранен при добавлении новых членов в него. Поэтому, если мой существующий ENUM выглядит примерно как ENUM('England','USA'), то мой новый ENUM должен быть определен как ENUM('England','USA','Sweden','Malaysia'), а не ENUM('USA','England','Sweden','Malaysia'). Эта проблема проявляется только при наличии записей в существующей таблице, которые используют значения 'USA' или 'England'.

НИЖНЯЯ ЛИНИЯ:

Используйте ENUMs только в том случае, если вы не ожидаете, что ваш набор членов изменится после определения. В противном случае таблицы поиска гораздо проще обновлять и модифицировать.

72
Zaid

В версии сервера MYSQL: 5.0.27 я пробовал это, и он работал нормально, проверьте мою версию

ALTER TABLE carmake
     MODIFY `country` ENUM('Japan', 'USA', 'England', 'Australia', 'Germany', 'France', 'Italy', 'Spain', 'Czech Republic', 'China', 'South Korea', 'India', 'Sweden', 'Malaysia');
2
Abhishek

Вот еще один способ ...

Он добавляет «другие» к определению перечисления столбца «rtipo» таблицы «фирма».

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 [email protected]_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;
1
Antonio

К сведению: полезный инструмент моделирования - phpMyAdmin с Wampserver 3.0.6 - Предварительный просмотр SQL: я использую «Предварительный просмотр SQL», чтобы увидеть код SQL, который будет сгенерирован перед сохранением столбца с изменением на ENUM. Предварительный просмотр SQL

Выше вы видите, что я ввел 'Ford', 'Toyota' в ENUM, но я получаю синтаксис ENUM (0), который генерирует синтаксическую ошибку Ошибка запроса 1064 #

Затем я копирую, вставляю и изменяю SQL и запускаю его через SQL с положительным результатом.

SQL изменено

Это быстрое исправление, которое я часто использую, и его также можно использовать для существующих значений ENUM, которые необходимо изменить. Думаю, это может быть полезно.

0
Addi