首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成列条件的SQL查询,其中不一定需要空或填充

生成列条件的SQL查询,其中不一定需要空或填充
EN

Stack Overflow用户
提问于 2018-12-08 08:47:15
回答 3查看 59关注 0票数 0

我的sql查询有问题。它更像是一个父母和孩子的桌子。因为用户可以是父用户,也可以是子用户。我做了一张四栏的桌子。

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

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

请注意,这必须只有一个表。

下面是我的SQL查询:

代码语言:javascript
复制
CREATE TABLE user (uname text primary key not null, password text not null, usertype text not null, parent text);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-08 09:49:19

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

代码语言:javascript
复制
ALTER TABLE user ADD CONSTRAINT
ck_CheckParents CHECK 
(
    ((usertype='parent') and (parent is null)) or 
    ((usertype='child') and (parent is not null ))
)
GO

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

代码语言:javascript
复制
ALTER TABLE user ADD CONSTRAINT
ck_CheckParents CHECK  
    ((usertype='child') and (parent is not null ))
GO
票数 0
EN

Stack Overflow用户

发布于 2018-12-08 10:29:34

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

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

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2018-12-08 12:41:13

现在,当用户注册为父级时,他/她不一定要填充第4列。但是,当用户注册为子用户时,他/她必须进行填充。

请注意,这种描述允许“父”具有父级。

MySQL没有给出很多选择。您可以使用"check约束“来表示这个逻辑:

代码语言:javascript
复制
alter users add constraint ck_users_parent
    check ( not (usertype = 'child' and parent is null) );

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

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

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

https://stackoverflow.com/questions/53680953

复制
相关文章

相似问题

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