繁体   English   中英

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

[英]how do you enforce conditional not null check across sql columns

create table A (id, col_A, col_B, col_C)

id = 被持久化的每一行的唯一 id col_Acol_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")

注意:根据设计,col_A 和 col_B 不能合并为单个列。

我想根据上述限制对 col_A 和 col_B 强制执行条件非空检查(即,对于每一行,至少应存在 col_A 或 col_B)。 我如何做到这一点?

编辑:

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

您需要定义一个表级检查约束。 以下使用 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 ) 
    )
/

编辑

为了回应你的评论,我想这会是

@org.hibernate.annotations.Check(

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

)

但作为数据建模师和 DBA,这确实是我希望在数据库中强制执行的那种事情。 我不认为在不同风格的 RDBMS 中,语法真的不会有太大变化,如果有的话。

您可以使用约束来检查 col_a 不为空或 col_b 不为空。 如果两列都为空或者两列都不为空,这会给你一个错误。 它只允许带有 a 或 b 的记录。

在 SQL Server 中会像:

ALTER TABLE [dbo].[A]  
WITH CHECK ADD  CONSTRAINT [CK_test] 
   CHECK  (([col_a] IS NOT NULL and [col_b] IS NULL)
        or ([col_a] IS NULL and [col_b] IS NOT NULL)
        )

触发器。 由于您尚未指定哪个数据库,因此很难给出更详细的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM