【问题标题】:Autogrowing ENUMs in MySQL在 MySQL 中自动增长 ENUM
【发布时间】:2012-07-16 06:04:58
【问题描述】:

我想优化具有VARCHAR 列的表,这些列只计数很少——大多数时候少于几十个,有时是几百个——不同的值。所以我希望将这些列转换为ENUMs,关键是我无法预测这些值本身,所以我希望在必要时即时构建它们。

不幸的是,MySQL 在插入不存在的值时似乎不会抛出错误,而是会存储 NULL

例如:

CREATE TABLE `enumed` (
  `col` ENUM( 'a', 'b' )
);

INSERT INTO `enumed` ( `col`) VALUES ('b');
INSERT INTO `enumed` ( `col`) VALUES ('z');

将存储一行 'b' 和一行 NULL 且没有错误。很明显,我无法负担另一个查询来获取值的无效性,但更愿意出现错误,在这种情况下,我会像下面这样扩展 ENUM 定义并重复查询。

ALTER TABLE `enumed` CHANGE `col` `col` ENUM( 'a', 'b', 'z' );
INSERT INTO `enumed` ( `col`) VALUES ('b');

有什么方法可以实现这一点,还是只是一种痛苦的方式来处理需要表格的外部集合?

【问题讨论】:

  • 你到底想达到什么目的?另外,您为什么要使用枚举?在我看来,他们很邪恶:komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil
  • 所以你将一个值添加到col,如果它在enum 中不存在,你会改变表吗?我很抱歉,但这根本没有任何意义。总之,这意味着enumed 中允许使用任何值(因此您可以只使用varchar),但是要使表格保持最新,您需要做更多的工作。我只是看不出在这里使用enum 有什么好处。还是我错过了什么?
  • ENUM 需要 1 个字节来存储,在我的示例中,VARCHAR 平均约为 30 个字节,并且我存储了数百万条记录。我只是尽量节省空间
  • 根据您的用例,创建一个单独的查找表可能有意义,enumed 可以存储基于序列的代理标识符。

标签: mysql sql dynamic enums


【解决方案1】:

如果启用严格的 SQL 模式,尝试存储无效的 ENUM 值会报错。您可以检查此错误,扩展 ENUM,然后重试 INSERT。

【讨论】:

  • 这几乎就是我想要的。谢谢,我试试看。
猜你喜欢
  • 2011-08-17
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 2019-03-04
  • 1970-01-01
相关资源
最近更新 更多