SQL 查询,用于生成不一定需要为空或填充的列条件



我的sql查询有问题。它更像是一个父子表。因为用户可以是父级或子级。我做了一张有四列的桌子。

第一列是用户的用户名第2列是用户的密码第三列是用户类型(父级或子级(第4列是父用户名的列(当用户是子用户时(。

现在,当用户注册为父级时,他/她不一定要填写第4列。但是,当用户注册为儿童时,他/她必须填写。有人能帮忙吗?

请注意,这必须只有一张桌子。

这是我的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"时,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没有实现"检查"约束,所以逻辑什么都不做。您可以使用触发器来实现逻辑,但这似乎有些过头了。

我的推荐?删除用户类型列。让数据自己说话吧。你有一个层次结构,所以你可以查询它来获得用户的"类型"。

最新更新