首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何限制只接受特定值的列?

问如何限制只接受特定值的列?
EN

Stack Overflow用户
提问于 2015-08-12 13:57:43
回答 2查看 59关注 0票数 0

我有一个名为vote_value的专栏。该列的内容始终是1或-1。为了获得更多的安全性,我想限制它只接受两个值(1或-1)。有什么解决办法吗?

在插入之前,我可以通过PHP做到这一点:

代码语言:javascript
复制
if($vote_value !== '1' && $vote_value !== '-1'){ echo 'not valid!' }

但是我想知道,通过mysql是否有可能呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-12 14:08:59

除了check约束(MySQL的存储引擎没有实现该约束,尽管语法已被接受)之外,您还有其他选项或触发器。

一种是使用枚举类型。这对输入是有效的。但是,我一般不喜欢枚举类型,它们会对数字数据产生混淆。

另一种方式是外键关系:

代码语言:javascript
复制
create table refValidVotes (
    vote int,
    description varchar(255)
);

insert into refValidVotes(Vote, Description)
    select 1, 'Aye' union all select -1, 'Nay';

create table . . . (
    . . .
    vote int not null,  -- Perhaps you want to allow NULL
    constraint chk_valid_vote foreign key (vote) references refValidVotes(vote)
);

另一种选择是使用bit,如果您实际上只有两个值:

代码语言:javascript
复制
vote bit(1)

然而,这两个值是0和1,而不是-1和1。

票数 4
EN

Stack Overflow用户

发布于 2015-08-12 14:01:02

通常,您会对此使用check约束,但MySQL目前不支持该约束。如果值不正确,则使用取消更新/插入的触发器

代码语言:javascript
复制
delimiter $$
CREATE TRIGGER check_value_trigger
BEFORE UPDATE ON your_table
FOR EACH ROW
BEGIN
   IF (NEW.vote_value not in (1,-1)) THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'value out of range';
   END IF;    
END
$$

您需要2个触发器-一个用于更新,一个用于插入。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31967356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档