检查引用同一 table 中的多个列的约束

check constraint that references multiple columns in the same table

我正在尝试向将检查三列的 DB2 数据库添加约束。我使用的 table 是一张发票 table,其中包括发票上每个订单项的开始日期结束日期数量项目价格等。我想防止在列 linestatus = RELELASED 时允许开始和结束日期为空。这是我到目前为止的更改声明。我的问题是为什么这行不通?我已验证此 table 没有所有这三项检查的任何当前实例。

alter table pluspgbtrans 
add constraint start_end_notnull 
Check (eip_linestatus = 'RELEASED' AND eip_endate is not null AND eip_startdate is not null)

您的 SQL 声明有效。

但是,您的逻辑有一个错误:此检查不适用 如果 eip_linestatus = 'RELEASED'

正如所写,您的约束是断言 所有行 必须具有 eip_linestatus = 'RELEASED' AND eip_endate is not null AND eip_startdate is not null

因此,如果 table 中的任何行的 eip_linestatus 的值不是 RELEASED,您将在以下情况下收到 SQL0544N 错误尝试添加约束。

要创建您正在寻找的约束,您需要处理 eip_linestatus 的其他状态。我猜不出它们是什么,所以这是一个潜在的通用选项:

alter table pluspgbtrans 
    add constraint start_end_notnull check (
        (eip_linestatus <> 'RELEASED') 
        OR
        (
             eip_linestatus = 'RELEASED' 
             AND eip_endate is not null 
             AND eip_startdate is not null
        )
    );