2012-07-17 63 views
4

我想优化具有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'); 

有什么办法来实现这一目标还是只是为了处理外国集合,将需要一个表痛苦的样子?

+9

你究竟想要达到什么目的?另外你为什么使用枚举?在我看来,他们是非常邪恶的: http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/ – ApplePie 2012-07-17 11:14:31

+2

所以,你将一个值添加到'col'和如果它不存在于'enum'中,则改变表格?我很抱歉,但这根本没有任何意义。它最后意味着'enumed'中允许任何值(所以你可以使用'varchar'),但是需要你做更多的工作来保持表的最新状态。 我只是没有看到在这里使用'enum'的好处。或者我错过了什么? – Horen 2012-07-17 11:37:34

+0

在我的例子中,ENUM需要1个字节来存储,VARCHAR约为平均30个字节,而且我存储了数百万条记录。我只是尽量保留尽可能多的空间 – 2012-07-17 14:17:48

回答

1

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

+0

这几乎是我在找的东西。谢谢,我会给它一个镜头。 – 2012-07-19 09:38:46

+0

备案:https://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html – 2012-07-19 10:03:37