我想优化具有VARCHAR
列的表,其中只有少数几列 - 大部分时间少于几十个,有时几百个不同的值。因此,我希望将这些列转换为ENUM
,关键是我无法预测这些值本身,所以我希望在必要时即时创建它们。在MySQL中自动增长ENUM
不幸的是,当插入一个不存在的值时,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');
有什么办法来实现这一目标还是只是为了处理外国集合,将需要一个表痛苦的样子?
你究竟想要达到什么目的?另外你为什么使用枚举?在我看来,他们是非常邪恶的: http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/ – ApplePie 2012-07-17 11:14:31
所以,你将一个值添加到'col'和如果它不存在于'enum'中,则改变表格?我很抱歉,但这根本没有任何意义。它最后意味着'enumed'中允许任何值(所以你可以使用'varchar'),但是需要你做更多的工作来保持表的最新状态。 我只是没有看到在这里使用'enum'的好处。或者我错过了什么? – Horen 2012-07-17 11:37:34
在我的例子中,ENUM需要1个字节来存储,VARCHAR约为平均30个字节,而且我存储了数百万条记录。我只是尽量保留尽可能多的空间 – 2012-07-17 14:17:48