如何跨sql列强制执行条件非空检查

Joe*_*Joe 3 sql database-design hibernate jpa

create table A (id, col_A, col_B, col_C)
Run Code Online (Sandbox Code Playgroud)

id =保留的每一行的唯一ID col_A col_B将具有有效值,但两个列不会同时具有每个持久行的值.

例如

insert into A (id, col_A, col_C) values (1, "a", "c")
insert into A (id, col_B, col_C) values (1, "b", "c")
insert into A (id, col_A, col_C) values (1, "aa", "cc")
insert into A (id, col_B, col_C) values (1, "bb", "cc")
Run Code Online (Sandbox Code Playgroud)

注意:col_A和col_B不能按照设计合并为单个列.

我想基于上述限制强制执行col_A和col_B的条件非空检查(即,对于每个行至少应存在col_A或col_B).我如何实现这一目标?

编辑:1.我们想支持以下数据库从H2,MySQL,Postgres 2开始.我们还希望通过JPA注释而不是数据库特定语法来表达约束.3.底层ORM层是Hibernate 3.3.x

APC*_*APC 5

您需要定义表级检查约束.以下使用Oracle语法,但大多数DBMS产品都会有类似的东西....

alter table A add constraint a_or_b
    check (
        ( a is not null and b is null ) 
    or
        ( a is null and b is not null ) 
    )
/
Run Code Online (Sandbox Code Playgroud)

编辑

在回应你的评论时,我猜它会是

@org.hibernate.annotations.Check(

constraints = “(a is not null and b is null) or (a is null and b is not null)”

)
Run Code Online (Sandbox Code Playgroud)

但作为数据建模者和DBA,这实际上是我想要在数据库中强制执行的事情.我不认为语法在RDBMS的不同风格上会有很大差异,如果有的话.