【问题标题】:SQL Database SystemsSQL 数据库系统
【发布时间】:2018-12-15 18:06:06
【问题描述】:

我的关系中有三个布尔属性,我希望它们中只有一个具有真实值,否则表应该会出错。我怎样才能做到这一点?

【问题讨论】:

  • 你的关系型数据库是什么?
  • @paulsm4: 当然这可以使用 SQL 来完成,它被称为检查约束
  • @GordonLinoff:是的。布尔类型是在 SQL:1999 中引入的,参见例如this presentation - 具有讽刺意味的是,它来自 Oracle,尽管 Oracle 仍然缺少真正的布尔类型。

标签: sql database schema


【解决方案1】:

如果您的 DBMS 支持检查约束(大多数都支持),您可以使用检查约束。在其中您检查,其中一个标志是正确的。为此,您可以使用布尔表达式。

CREATE TABLE elbat
             (...
              CHECK (flag1 = true
                     AND flag2 = false
                     AND flag3 = false
                      OR flag1 = false
                         AND flag2 = true
                         AND flag3 = false
                       OR flag1 = false
                          AND flag2 = false
                          AND flag3 = true));

(只是为了理解,语法可能因 DBMS 而异。)

【讨论】:

    【解决方案2】:

    您可以为此使用检查约束。

    create table some_table
    (
      flag1 boolean not null,
      flag2 boolean not null,
      flag3 boolean not null,
      constraint only_one_true 
          check ( (flag1,flag2,flag3) IN ( (true, false, false), 
                                           (false, true, false),
                                           (false, false, true)) ) 
    );
    

    以上是标准SQL。

    一些 DBMS 系统还允许将布尔值转换为表示 01 的数字,在这种情况下,您可以将它们相加,并且总和必须等于 1(确保恰好一个标志设置为 true)

    create table some_table
    (
      flag1 boolean not null,
      flag2 boolean not null,
      flag3 boolean not null,
      constraint only_one_true 
          check ( cast(flag1 as integer) + 
                  cast(flag2 as integer) + 
                  cast(flag3 as integer) = 1 )
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 2018-01-15
      相关资源
      最近更新 更多