【发布时间】: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可以存储基于序列的代理标识符。