[英]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.