Mysql将字段的值限制为已定义的字段之一

时间:2012-08-28 18:42:37

标签: mysql validation

我正在使用mysql数据库。

我在user_type表格中有一个字段USER。我想将此字段中的值限制为('ADMIN','AGENT','CUSTOMER')之一。

如果插入语句试图插入除上述可能值之外的其他内容,则它们将失败。另外,我需要默认为'CUSTOMER',在insert语句中没有指定。

我能想到的可能解决方案是使用triggers,但我想知道如何更有效地处理这个问题(可能在create table ddl本身?)。

任何想法,如何做到这一点?

2 个答案:

答案 0 :(得分:7)

这是column type "enum"的用途。您将其视为字符串,并在幕后将其存储为int,并且必须是DDL中定义的值之一:

CREATE TABLE users (
  id int unsigned NOT NULL auto_increment primary key,
  user_type enum('ADMIN', 'AGENT', 'CUSTOMER') NOT NULL default 'CUSTOMER'
)

然后像这样插入:

INSERT INTO users (user_type) VALUES ('ADMIN'); // success
INSERT INTO users (user_type) VALUES ('ANONYMOUS'); // failure (or '' if not "strict" mode)
INSERT INTO users (user_type) VALUES (default(user_type)); // uses default
INSERT INTO users () VALUES (); // uses default
INSERT INTO users (user_type) VALUES (NULL); // failure

注释

请注意,要使查询实际失败,必须使用“SQL严格模式”。否则,将插入一个“空字符串”值(稍微特殊,因为它的数值为0)。

引用this docs page

  

当本手册引用“严格模式”时,它表示至少启用了STRICT_TRANS_TABLES或STRICT_ALL_TABLES之一的模式。

答案 1 :(得分:0)

我碰到了这篇文章,并且回想起来有些时候,我也在想着这些天也碰到过其他文章,并且错过了(我认为)简单地添加QueryStateData约束(例如{对于MySQL是{3}},对于MariaDB是this

我认为,使用CHECK约束比使用CHECK和/或ENUM这样的约束要容易得多,因为您不必担心与整数索引的关系等。当依靠他们。例如,当您尝试为列预设允许的整数值时,它们可能会变得很奇怪。

例如,您要具有一列,其值的范围是1到5:

SET