验证有限数量选项的字符串输入的最佳方法

时间:2017-03-30 13:19:33

标签: mysql sql

我正在尝试验证MySQL中的输入,并希望限制属性的字符串值的输入属于集合{'type1', 'type2', 'type3', 'type4', 'type5'}。我已经选择使用ENUM{'type1', 'type2', 'type3', 'type4', 'type5'}数据类型。虽然这似乎阻止了无效数据的插入,但它没有向用户提供足够描述性的错误消息以合理地纠正输入。错误消息是:

  

第1行的“类型”列截断数据

这并不表示我正在寻找其中一个枚举值。我正在考虑添加的是BEFORE INSERT触发器,用于检查字符串是否有效以及字段和错误(如果不是)。但是,我对SQL语法很不熟悉,而且我的实现看起来很笨重:

IF (NEW.type <> 'Type1' OR
    NEW.type <> 'Type2' OR 
    NEW.type <> 'Type3' OR
    NEW.type <> 'Type4' OR 
    NEW.type <> 'Type5')
THEN
    SIGNAL SQLSTATE '45000'
        SET MESSAGE_TEXT = "Please ensure 'type' is one of the following: Type1, Type2, Type3, Type4, or Type5";
END IF;

是否有更好的方法来实现我正在寻找的东西(即,如果输入属于'ListOfTypes'而不是使用如此多的OR),因为这可能会使大量有效类型变得非常笨重。这种双重验证是否必要或谨慎?我认识到这会阻止我使用索引作为输入,这是ENUM数据类型的一个好处。如果这个问题有明显的答案,我道歉。谢谢!

1 个答案:

答案 0 :(得分:2)

如果您不想使用ENUM,那么使用NOT IN (...)语法会如何:

IF (NEW.type NOT IN ('Type1','Type2','Type3','Type4','Type5'))
THEN
    SIGNAL SQLSTATE '45000'
        SET MESSAGE_TEXT = "Please ensure 'type' is one of the following: Type1, Type2, Type3, Type4, or Type5";
END IF;