Удаление значений перечисления из столбца mysql

у меня есть таблица со столбцом типа enum называется action. Допустимые значения в настоящее время:: act1,act2,act3,act4. Я хочу!--2--> и act4 для удаления, и текущее состояние моей таблицы не содержит строк с act3 или act4.

когда я пытаюсь изменить столбец с новым набором значений, он выдает ошибку Data Truncated for column action.

пожалуйста, предложите, как удалить необходимые значения.

3 ответов


используя ALTER TABLE для добавления значений перечисления в порядке и описано в документация MySQL.

однако для удаления значений перечисления лучшим вариантом является создание нового столбца для внесения изменений.

ALTER TABLE your_table ADD new_action_column ENUM('act1', 'act2') ... ;
UPDATE your_table SET new_action_column = action;
ALTER TABLE your_table DROP action;
ALTER TABLE your_table CHANGE new_action_column action ENUM('act1', 'act2') ... ;

редактировать

кстати. Используя ENUM - это не самая лучшая идея, вы должны использовать .

8 причин, почему тип данных перечисления MySQL является злым

Я предлагаю вам используйте отображение типа

+------+-----+
| ENUM | INT |
+======+=====+
| act1 |  0  |
+------+-----+
| act2 |  1  |
+------+-----+

сначала выполнить запрос.

UPDATE table_name SET action = '' WHERE action IN ( 'act3', 'act4' );

после этого запустите этот запрос.

ALTER TABLE table_name CHANGE action action ENUM( 'act1', 'act2' );

нет необходимости отбрасывать таблицу или удалять поле. но вы должны удалить или обновить все данные, имеющие значения, которые вы хотите удалить.


два других ответа уже охватывали вопрос более подробно, но вот простой вопрос, почему вы возможно, не удастся просто сделать ALTER TABLE. Если у вас есть перечисление ("BAR", "FOO", "REMOVEME"), и оно дает ошибку, говоря что-то по строкам данных, усеченных somethingsomething, у вас уже может быть запись, установленная на тот самый член перечисления, который вы хотите удалить. Поэтому сначала вам нужно сделать что-то вроде

обновить набор таблиц enumrow= 'FOO', где yourenumrow = 'REMOVEME';

таким образом, все записи, которые имели REMOVEME теперь будут FOO и таблица может быть изменена с помощью

ALTER TABLE yourtable CHANGE yourenumrow перечисление yourenumrow ('FOO', 'BAR') значение по умолчанию NULL;