我的sql查询有问题。它更像是一个父母和孩子的桌子。因为用户可以是父用户,也可以是子用户。我做了一张四栏的桌子。
第一列是用户的用户名,第二列是用户的密码,第三列是用户类型(父或子),第四列是父用户名的列(当用户是子用户时)。
现在,当用户注册为父级时,他/她不一定要填充第4列。但是,当用户注册为子用户时,他/她必须进行填充。有人能帮忙吗?
请注意,这必须只有一个表。
下面是我的SQL查询:
CREATE TABLE user (uname text primary key not null, password text not null, usertype text not null, parent text);发布于 2018-12-08 09:49:19
通过添加此检查约束,您的要求是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发布于 2018-12-08 10:29:34
从设计的角度来看,最好为父列和子列设置两个分隔的列,其中一个和唯一的一个必须被填充。在不同的字段中分离不同的关注点可能会使查询表时的逻辑变得更简单。
可以使用约束检查来控制放入表中的数据是否与规则匹配。
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发布于 2018-12-08 12:41:13
现在,当用户注册为父级时,他/她不一定要填充第4列。但是,当用户注册为子用户时,他/她必须进行填充。
请注意,这种描述允许“父”具有父级。
MySQL没有给出很多选择。您可以使用"check约束“来表示这个逻辑:
alter users add constraint ck_users_parent
check ( not (usertype = 'child' and parent is null) );不幸的是,MySQL没有实现“检查”约束,因此逻辑不会做任何事情。您可以使用触发器来实现逻辑,但这似乎太过了。
我的推荐信?删除“用户类型”列。让数据本身来说明。您有一个层次结构,因此您可以查询该结构以获得用户的“类型”。
https://stackoverflow.com/questions/53680953
复制相似问题