2012-08-28 41 views
0

我正在使用mysql数据库。Mysql限制某个字段的值为定义的字段之一

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

如果插入语句试图插入除上述可能值之外的任何内容,则应该失败。另外,我需要默认'CUSTOMER',但在插入语句中没有指定。

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

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

回答

6

这就是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中的至少一者的模式。

+0

谢谢!真的很有帮助。有关如何使用空的'user_type'将插入语句默认为'CUSTOMER'的任何评论? – mtk

+0

是的,只是要么不将它包含在列表中,要么使用'default'函数:'VALUES(默认(user_type))' –

+0

(用更多的插入示例更新答案) –

相关问题