【问题标题】:SQL Query to generate a column condition where it doesn't necessarily need to be empty nor filledSQL Query 生成一个列条件,它不一定需要为空或填充
【发布时间】:2018-12-08 08:47:15
【问题描述】:

我的 sql 查询有问题。它更像是一个父子表。因为用户可以是父母或孩子。我做了一个有 4 列的表格。

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

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

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

这是我的 SQL 查询:

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

【问题讨论】:

  • 您的查询似乎没有问题。插入父项时将第 4 个字段填充为 null
  • 像 CREATE 这样的 DDL 只是用于定义表可以接受的内容,您需要过滤用户并确定该字段是否需要使用 DML 或某些客户端验证

标签: android mysql sql


【解决方案1】:

通过添加如下所示的检查约束,您的要求是 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

【讨论】:

    【解决方案2】:

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

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

    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
    

    【讨论】:

      【解决方案3】:

      现在,当用户注册为父母时,他/她不必填写第 4 列。但是当用户注册为孩子时,他/她必须填写。

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

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

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

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

      我的建议?删除用户类型列。让数据自己说话。你有一个层次结构,所以你可以查询它来获取用户的“类型”。

      【讨论】:

        猜你喜欢
        • 2022-01-15
        • 2011-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-11
        • 1970-01-01
        • 2018-10-08
        相关资源
        最近更新 更多