9

我有一个带有枚举列的表,名为action. 当前允许的值为: act1,act2,act3,act4. 我想要act3act4被删除,并且我的表的当前状态不包含任何带有act3or的行act4

当我尝试使用新值集修改列时,它会抛出错误 Data Truncated for column action

请建议我如何删除所需的值。

4

3 回答 3

11

用于添加枚举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不是最好的主意,你应该使用INT

MySQL 的 ENUM 数据类型邪恶的 8 个原因

我建议您使用类似的映射

+------+-----+
| ENUM | INT |
+======+=====+
| act1 |  0  |
+------+-----+
| act2 |  1  |
+------+-----+
于 2012-09-26T08:56:00.067 回答
3

首先运行一个查询。

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

在此之后运行此查询。

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

无需删除您的表格或删除您的字段。但是您需要删除或更新所有具有要删除的值的数据。

于 2012-09-26T09:02:47.947 回答
1

其他两个答案已经更详细地介绍了这个问题,但这里有一个简单的问题,为什么可能无法简单地执行 ALTER TABLE。如果你有一个 ENUM('BAR','FOO','REMOVEME') 并且它给出了一个错误,说明了一些类似于 Data truncated somethingsomething 的内容,那么你可能已经为要删除的 Enum 成员设置了一个条目。所以你首先需要做类似的事情

UPDATE yourtable SET enumrow='FOO' WHERE yourenumrow = 'REMOVEME';

这样,所有具有 REMOVEME 的条目现在都将是 FOO 并且可以使用更改表

ALTER TABLE yourtable CHANGE yourenumrow yourenumrow ENUM('FOO','BAR') DEFAULT NULL;

于 2016-12-04T11:58:53.880 回答