我正在使用mysql数据库。
我user_type
在USER
表中有一个字段。我想将此字段中的值限制为('ADMIN','AGENT','CUSTOMER')之一。
如果插入语句尝试插入上述可能值之外的任何内容,则它们应该会失败。另外,我需要默认为“客户”,在插入语句中没有指定。
我能想到的可能解决方案是使用triggers
,但我想知道如何更有效地处理这个问题(可能在创建表 ddl 本身中?)。
任何想法,如何做到这一点?
我正在使用mysql数据库。
我user_type
在USER
表中有一个字段。我想将此字段中的值限制为('ADMIN','AGENT','CUSTOMER')之一。
如果插入语句尝试插入上述可能值之外的任何内容,则它们应该会失败。另外,我需要默认为“客户”,在插入语句中没有指定。
我能想到的可能解决方案是使用triggers
,但我想知道如何更有效地处理这个问题(可能在创建表 ddl 本身中?)。
任何想法,如何做到这一点?
这就是列类型“枚举”的用途。你把它当作一个字符串,在幕后它被存储为一个 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)。
引用此文档页面:
当本手册提及“严格模式”时,是指启用 STRICT_TRANS_TABLES 或 STRICT_ALL_TABLES 中的至少一个的模式。
我遇到了这篇文章,因为它可以追溯到有点早,我在想其他人这些天也遇到过它,并且错过了(在我看来)简单添加CHECK
约束的更简单的方法(例如,对于 MySQL,或者对于MariaDB) .
在我看来,使用CHECK
约束比使用ENUM
和 /之类的东西要容易得多,SET
因为当你依赖它们时,你不需要担心与整数索引等的关系。例如,当您尝试为列预设允许的整数值时,它们可能会变得很奇怪。
例如,您希望有一列的值范围为 1 到 5:
CREATE TABLE myTable (
myCol INT NOT NULL
CONSTRAINT CHECK (0 < `myCol` < 5)
);