从mysql列中删除枚举值

10
我有一个名为action的枚举列的表格。目前允许的值为:act1,act2,act3,act4。我想要删除act3act4,而我的表格当前状态不包含任何行与act3act4

当我试图用新的值集修改该列时,会出现Data Truncated for column action错误。

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


也许根本不要使用枚举?http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/ - fancyPants
请展示您的CREATE TABLE和ALTER TABLE语句。 - Alex Monthy
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  |
+------+-----+

1
你应该使用INT。-为什么? - Barmar
@Barmar MySQL的ENUM数据类型为什么邪恶?8个理由 Tombom已经提到了。我建议使用枚举值“act1”和“act2”与整数值0、1之间的映射。 - Florian Parain
@FlorianParain 我想知道为什么不改变现有的列而是添加一个临时列会更有优势。你能解释一下你的说法吗?谢谢! - magic_al

4

首先运行一个查询。

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

运行此查询。

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

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


他说没有任何行具有他要删除的值。 - Barmar
我不需要执行上述步骤,因为我的表中没有包含“act3”和“act4”的行。但错误仍然存在。 - mickeymoon

2
其他两个答案已经详细回答了这个问题,但这里有一个简单的问题,为什么可能无法简单地执行ALTER TABLE。如果你有一个ENUM('BAR','FOO','REMOVEME')并且它给出一个错误,说类似于数据截断某些东西,你可能已经设置了一个条目到你想要删除的枚举成员。所以你需要首先做一些像这样的事情:

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

这样,所有具有REMOVEME的条目现在都将是FOO,然后可以使用以下方式更改表:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接