65

我有一个 MySQL 表“ content”,其中有一列page_type类型ENUMENUM值为NEWS& PRESS_RELEASE。_ 我需要替换NEWSFEATURED_COVERAGE

ALTER TABLE `content` CHANGE `pagetype` `pagetype` ENUM('FEATURED_COVERAGE','PRESS_RELEASE') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;

但是现在表中之前有 page_type 的记录NEWS现在是空的,我无法识别哪些记录是NEWS,因此我可以将它们重命名为FEATURED_COVERAGE

如何解决此类问题?

4

4 回答 4

131

如果我理解您的问题,您想将现有的枚举值重命名NEWSFEATURED_COVERAGE. 如果是这样,您需要按照以下步骤操作,

  1. 更改表并将新的枚举值添加到列中,这样您将拥有 3 个枚举

    ALTER TABLE `content` CHANGE `pagetype` `pagetype`
    ENUM('FEATURED_COVERAGE','PRESS_RELEASE', 'NEWS') CHARACTER SET utf8
    COLLATE utf8_general_ci NOT NULL;
    
  2. 将所有记录的旧枚举值设置为新值。

    UPDATE `content` set `pagetype` = 'FEATURED_COVERAGE' where
    `pagetype` = 'NEWS';
    
  3. 更改表并删除旧的枚举值。

    ALTER TABLE `content` CHANGE `pagetype` `pagetype`
    ENUM('FEATURED_COVERAGE','PRESS_RELEASE') CHARACTER SET utf8 COLLATE
    utf8_general_ci NOT NULL;
    
于 2013-03-26T16:56:05.773 回答
7

MySQL 的 enum 总是有一个隐藏选项,它是 0 作为整数和 '' 作为字符串。当您尝试分配无效值时,它会使用隐藏的值。

假设您所有的空值在更新之前都是“新闻”,您可以使用

UPDATE content SET pagetype = 'FEATURED_COVERAGE' WHERE pagetype = 0
于 2013-03-26T16:55:18.070 回答
2

我认为默认值可能有所帮助。

ALTER TABLE `content`
CHANGE `pagetype` `pagetype` ENUM('FEATURED_COVERAGE','PRESS_RELEASE') 
   CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULt 'FEATURED_COVERAGE';

现在你必须盲目地更新

如果您的值集发生变化,切勿使用枚举列。

于 2013-03-26T16:57:39.903 回答
2

由于您只更改了一个枚举,因此对您来说并不困难

尝试使用这个

UPDATE content SET pagetype = 'FEATURED_COVERAGE' WHERE pagetype = 0
于 2013-03-26T16:57:58.233 回答