繁体   English   中英

SQL查询生成一个列条件,该列条件不一定需要为空也不填充

[英]SQL Query to generate a column condition where it doesn't necessarily need to be empty nor filled

我的SQL查询有问题。 它更像是一个父子表。 由于用户可以是父母或孩子。 我做了一张有四列的桌子。

第一列是用户的用户名第二列是用户的密码第三列是用户类型(父母或孩子)第四列是父母用户名的列(当用户是孩子时)。

现在,当用户注册为父母时,他/她不必填写第4列。 但是,当用户注册为儿童时,他/她必须填写该信息。 有人可以帮忙吗?

请注意,这只能是1张桌子。

这是我的SQL查询:

CREATE TABLE user (uname text primary key not null, password text not null, usertype text not null, parent text);

通过添加此检查约束,您的要求是100%正常工作,如下所示。

ALTER TABLE user ADD CONSTRAINT
ck_CheckParents CHECK 
(
    ((usertype='parent') and (parent is null)) or 
    ((usertype='child') and (parent is not null ))
)
GO

如果您在用户类型为“父母”时需要在parent列中添加某些内容,则只需删除一个条件即可。

ALTER TABLE user ADD CONSTRAINT
ck_CheckParents CHECK  
    ((usertype='child') and (parent is not null ))
GO

从设计的角度来看,最好为父级和子级使用两个单独的列,其中必须只填充一列。 在不同的字段中分离不同的关注点可能会使查询表时的逻辑更简单。

您可以使用约束检查来控制您放入表中的数据与规则匹配。

ALTER TABLE user 
    ADD CONSTRAINT ck_CheckParents
CHECK  
    ( child is null and parent is not null )
     or ( child is not null and parent is null )
GO

现在,当用户注册为父母时,他/她不必填写第4列。 但是,当用户注册为儿童时,他/她必须填写该信息。

注意,此描述允许“父母”拥有父母。

MySQL没有为此提供很多选择。 您可以使用“检查约束”表达这种逻辑:

alter users add constraint ck_users_parent
    check ( not (usertype = 'child' and parent is null) );

不幸的是,MySQL没有实现“检查”约束,因此逻辑没有做任何事情。 您可以使用触发器来实现逻辑,但这似乎有点过头了。

我的推荐? 删除用户类型列。 让数据说明一切。 您具有层次结构,因此可以查询该结构以获得用户的“类型”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM