从mysql列中删除枚举值

rqdpfwrv  于 2023-04-10  发布在  Mysql
关注(0)|答案(3)|浏览(120)

我有一个名为action的枚举列的表。当前允许的值是:act1,act2,act3,act4。我希望删除act3act4,并且我的表的当前状态不包含任何具有act3act4的行。
当我尝试用新的值集修改列时,它会抛出错误Data Truncated for column action
请建议如何删除所需的值。

xfb7svmp

xfb7svmp1#

使用ALTER TABLE添加枚举值是可以的,并在MySQL documentation中进行了描述。
然而,对于删除枚举值,更好的选择是创建一个新列来进行更改。

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
8 Reasons Why MySQL's ENUM Data Type Is Evil
我建议您使用类似于

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

q5lcpyga2#

首先运行一个查询。

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

在此之后运行此查询。

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

这是没有必要到drop你的表或drop你的字段.但你是需要删除或更新所有数据具有的值,你要删除.

2ul0zpep

2ul0zpep3#

其他两个答案已经更详细地讨论了这个问题,但这里有一个简单的问题,为什么 * 你 * 可能无法简单地执行ALTER TABLE。('BAR','FOO','REMOVEME')并且它给出一个错误,沿着数据截断的一些东西一些东西,你可能已经有一个条目设置为你想要删除的Enum成员。
UPDATE yourtable SET enumrow='FOO' WHERE yourenumrow = 'REMOVEME';
这样,所有具有REMOVEME的条目现在都将是FOO,并且可以使用
ALTER TABLE yourtable CHANGE yourenumrow yourenumrow ENUM('FOO','BAR')DEFAULT NULL;

相关问题