Sql 两列上的复合非空约束

Sql 两列上的复合非空约束,sql,postgresql,liquibase,Sql,Postgresql,Liquibase,我希望有一个约束,其中我确保至少有两列不为null。 基本上,从这两列中,必须包含一个值 我怎么能有这样的约束? 有可能用液化糖吗?如果没有,是否可以通过SQL或某些postgres特定的东西进行检查?您可以使用检查约束。对于至少一个非空值: check (col1 is not null or col2 is not null) 如果只需要一个值来包含值: check (col1 is not null and col2 is null or col1 is null and

我希望有一个约束,其中我确保至少有两列不为null。 基本上,从这两列中,必须包含一个值

我怎么能有这样的约束?
有可能用液化糖吗?如果没有,是否可以通过SQL或某些postgres特定的东西进行检查?

您可以使用
检查约束。对于至少一个非空值:

check (col1 is not null or col2 is not null)
如果只需要一个值来包含值:

check (col1 is not null and col2 is null or
       col1 is null and col2 is not null
      )
或在博士后:

check ( (col1 is not null)::int + (col2 is not null)::int = 1 )
       

您可以使用
检查
约束。对于至少一个非空值:

check (col1 is not null or col2 is not null)
如果只需要一个值来包含值:

check (col1 is not null and col2 is null or
       col1 is null and col2 is not null
      )
或在博士后:

check ( (col1 is not null)::int + (col2 is not null)::int = 1 )
       

我喜欢为此使用
num\u nonnulls()

<sql> 
  alter table the_table
    add constraint at_least_one_not_null
    check (num_nonnulls(col1, col2) >= 1)   
</sql>
对于至少一个非空列:

check (num_nonnulls(col1, col2) >= 1)
check (num_nonnulls(col1, col2) = 1)
对于一个非空列:

check (num_nonnulls(col1, col2) >= 1)
check (num_nonnulls(col1, col2) = 1)
Liquibase没有检查约束的内置更改(至少在社区版本中没有),因此您需要对此进行
更改:

<sql> 
  alter table the_table
    add constraint at_least_one_not_null
    check (num_nonnulls(col1, col2) >= 1)   
</sql>

改变表格
添加约束至少\u一个\u非\u空
检查(num_nonnulls(col1,col2)>=1)

我喜欢使用
num\u nonnulls()
来实现这一点:

<sql> 
  alter table the_table
    add constraint at_least_one_not_null
    check (num_nonnulls(col1, col2) >= 1)   
</sql>
对于至少一个非空列:

check (num_nonnulls(col1, col2) >= 1)
check (num_nonnulls(col1, col2) = 1)
对于一个非空列:

check (num_nonnulls(col1, col2) >= 1)
check (num_nonnulls(col1, col2) = 1)
Liquibase没有检查约束的内置更改(至少在社区版本中没有),因此您需要对此进行
更改:

<sql> 
  alter table the_table
    add constraint at_least_one_not_null
    check (num_nonnulls(col1, col2) >= 1)   
</sql>

改变表格
添加约束至少\u一个\u非\u空
检查(num_nonnulls(col1,col2)>=1)

我会试试这个!但这似乎预示着,并没有出现在我的脑海里。你就是那个人。这个一般逻辑起作用了。我对你的答案投了赞成票,但会将另一个标记为批准,因为他也提到了如何与liquibaseI合作。我会试试这个!但这似乎预示着,并没有出现在我的脑海里。你就是那个人。这个一般的逻辑起作用了。我把你的答案投了赞成票,但会把另一个标记为赞成票,因为他还提到了如何使用Liquibasew来实现这个奇怪的功能,这是我不知道的。这很容易在Postgres中编写代码,我想知道为什么会有这样的代码。但无论如何,我学到了一些东西。@GordonLinoff:是的,它真的很方便。还有一个
num_nulls()
表示“相反”,感谢您展示了这一点:)我也没有听说过:)这是一个多么奇怪的函数,我以前不知道。这很容易在Postgres中编写代码,我想知道为什么会有这样的代码。但无论如何,我学到了一些东西。@GordonLinoff:是的,它真的很方便。还有一个
num_nulls()
的“反面”感谢您展示:)我也没听说过:)与答案dba.SE相关:与答案dba.SE相关: