检查引用同一表

时间:2016-12-05 19:53:52

标签: sql db2 constraints db2-luw

我正在尝试向将检查三列的DB2数据库添加约束。我正在使用一张表作为发票表,其中包括发票上每个行项目的开始日期结束日期数量项目价格等。我希望阻止在列linestatus = RELELASED时允许开始日期和结束日期为空。这是我到目前为止的alter语句。我的问题是为什么这不起作用?我已经验证此表没有所有这三个检查的任何当前实例。

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

1 个答案:

答案 0 :(得分:0)

您的SQL语句有效。

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

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

因此,如果表中的任何行的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
        )
    );