我不确定是否无法更改 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/
表格或Type字段的最佳设计是什么?换句话说,鉴于此架构:intchar(1)
create table Car
(
Name varchar(100) not null,
Description varchar(100) not null,
VehType .... not null
)
Run Code Online (Sandbox Code Playgroud)
VehType成为 anint或 a是否更有效(在性能方面)char(1)?假设你有五种类型的汽车,你应该使用递增值 0 -> 4,还是类型的字符(比如;'v'、's'、'c'、't'、'm')?
如果不止于此,我将使用单独的 Type 表并具有外键关系,但我认为没有必要这样做。
我注意到sys.objects目录视图为type字段使用了一个字符。有什么原因吗?我是否只是在稀薄的空气中抓住了它,这是我更舒服的吗?
假设我有一个带有ENUM('value_one','value_two'). 我想将其更改为ENUM('First value','Second value'). 我目前这样做如下:
ALTER TABLE `table` MODIFY `column` ENUM('value_one','value_two','First value','Second value');
UPDATE `table` SET `column`='First Value' WHERE `column`='value_one';
UPDATE `table` SET `column`='Second Value' WHERE `column`='value_two';
ALTER TABLE `table` MODIFY `column` ENUM('First value','Second value');
Run Code Online (Sandbox Code Playgroud)
有没有更有效的方式来做到这一点,例如,用一个做到这一点的方式 单一的 ALTER TABLE声明?
因此,我与同事关于使用枚举与查找表存在分歧。
这篇 2011 年和 MySQL5.5 的非常老的文章仍然被那些不喜欢枚举的人一次又一次地引用。
但我们使用的是 MySQL8.0,数据库规模不是很大,比如 50 到 60 个表,有 30 左右的枚举列。
一些表的行数高达数百万行,大多数表的行数远低于 50 万行。
几乎所有枚举的值都少于 10 个,并且只有极少数在其生命周期中发生过更改(一次),总是在可能值的末尾添加新值。
而且我们从未“遭受”文章提到的任何缺点,例如将元数据存储在其旁边,引用其他表中的相同值等......
尽管文章在第 2 点中提到了这一点,但今天,在列表末尾添加值不会更新整个表,但删除值总是会更新(或至少读取)所有行。
我确实知道有两种流派,并且我了解两者的优点和缺点。
但是,今天在 MySQL8 上,是否存在任何实际/事实/技术原因,因此 ** 放弃现有列的枚举并证明应用程序和数据库中所需的所有工作都是合理的?
感谢您的阅读和回答。
可能的重复:
使用 ENUM 与 Integer 类型的优缺点?
仅考虑 MySQL...
我很想知道社区认为 ENUM 类型与 FK 到类型表的正确用例是什么。
我读过这个问题:使用 ENUM 与 Integer 类型的优点和缺点?,但是用例对我来说并没有得到很好的覆盖。
我和我的同事正在讨论数据库中描述性特征的规范化,例如“状态”或“类型”。让我们将讨论的中心表称为“订单”。
在我的常规设计方法中,我会定义另一个表“OrderStatus”来描述订单的状态,然后在“Order”表上创建一个具有关系的外键,即“OrderStatusID”。
这会给我参考完整性。我可以随时加入状态,并且我的可能值始终存在于“OrderStatus”表中。
我的同事不喜欢这种标准化程度,因此他将在“Order”表上定义一个 varchar 字段“OrderStatus”。该字段将直接包含值。
status 的可能值在他的应用程序中定义,更具体地说,在 OrderStatuses 的枚举中定义,因此,除非我可以访问所述应用程序的源代码,否则我无法使用。
我习惯于将数据库的整个上下文作为关系和表存在于数据库中,并且不得不编写“WHERE OrderStatus = 'Sold'”而不是“WHERE OrderStatusID = 3”让我感到烦恼。
怎么想?我正在寻找两种方法的优点和缺点,但我主要关注性能和可读性/可维护性。
我正在创建一个新表,我想做得正确。该表将是成员及其相关专业类型和十分位数的列表。
专业类型是 3 个字符的字符串。该字段仅允许 8 个字符串。我应该使用 ENUM 或 CHAR(3) 还是更好的东西?
十分位数可以是 1-10 之间的任何数字,但仅限于这些数字。我应该使用 ENUM 还是无符号 TINYINT 或者更好的东西?
哪些是提高效率的最佳选择?