是否可以更改 ENUM() 列表?

Aal*_*abi 21 mysql innodb

我不确定是否无法更改 ENUM() 列表,因此我进行了测试。在 MySQL v5.1.58 中,我制作了一个测试 InnoDB 表,其中包含一个名为 ENUM('yes', 'no') 的名为 'bool' 的字段。

然后我执行...

ALTER TABLE  `test`
CHANGE  `bool`  `bool` ENUM(  'yes',  'no',  'maybe' )
CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL
Run Code Online (Sandbox Code Playgroud)

...它奏效了。

我做错了什么吗?它依赖于数据库引擎吗?
为什么每个人都说更改 ENUM() 列表是不可能的?例如。这里http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/

Rol*_*DBA 16

只要桌子是空的,就没有问题。只要附加了 ENUM 的新值并且没有在给定填充表的情况下重命名,就没有问题。

您在问题中重新定义的 ENUM 实际上保留了 yes 和 no 的原始内部值,因为测试表最后记住了它。

以下适用于填充表:

那这个呢?

ALTER TABLE  `test`
CHANGE  `bool`  `bool` ENUM(  'no',  'yes',  'maybe' )
CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL
Run Code Online (Sandbox Code Playgroud)

现在你有一个问题。完全填充的表中的 ENUM 值将反转其内部值,以便 yes 现在为 no,no 现在为 yes。

那这个呢?

ALTER TABLE  `test`
CHANGE  `bool`  `bool` ENUM(  'maybe', 'no',  'yes' )
CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL
Run Code Online (Sandbox Code Playgroud)

大问题。在一个填充表中,是现在也许。插入 yes 的新行与之前的 yes 行断开连接,因为它们现在意味着可能。

概括

在 MyISAM 中有非常高风险的诱饵和转换技术可以非常快速地做到这一点。我强烈建议不要在 InnoDB 中这样做,因为它的表空间 id 与 ibdata1 交互。

  • 至少对于 MariaDB/InnoDB,我可以说这不再有效。更改ENUM的中间,只要没有删除/更改值的记录,其他值应保持原样。唯一的优点是它必须重建表。 (3认同)