我有一个名为action的枚举列的表。当前允许的值是:act1,act2,act3,act4。我希望删除act3和act4,并且我的表的当前状态不包含任何具有act3或act4的行。当我尝试用新的值集修改列时,它会抛出错误Data Truncated for column action。请建议如何删除所需的值。
action
act1,act2,act3,act4
act3
act4
Data Truncated for column action
xfb7svmp1#
使用ALTER TABLE添加枚举值是可以的,并在MySQL documentation中进行了描述。然而,对于删除枚举值,更好的选择是创建一个新列来进行更改。
ALTER TABLE
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
+------+-----+ | ENUM | INT | +======+=====+ | act1 | 0 | +------+-----+ | act2 | 1 | +------+-----+
q5lcpyga2#
首先运行一个查询。
UPDATE table_name SET action = '' WHERE action IN ( 'act3', 'act4' );
在此之后运行此查询。
ALTER TABLE table_name CHANGE action action ENUM( 'act1', 'act2' );
这是没有必要到drop你的表或drop你的字段.但你是需要删除或更新所有数据具有的值,你要删除.
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;
3条答案
按热度按时间xfb7svmp1#
使用
ALTER TABLE
添加枚举值是可以的,并在MySQL documentation中进行了描述。然而,对于删除枚举值,更好的选择是创建一个新列来进行更改。
编辑
顺便说一下,使用
ENUM
不是最好的主意,你应该使用INT
。8 Reasons Why MySQL's ENUM Data Type Is Evil
我建议您使用类似于
q5lcpyga2#
首先运行一个查询。
在此之后运行此查询。
这是没有必要到drop你的表或drop你的字段.但你是需要删除或更新所有数据具有的值,你要删除.
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;