2016-12-05 107 views
-2

我正在尝试将一个约束添加到将检查三列的DB2数据库。我使用的是发票表格,其中包含发票上每个行项目的开始日期结束日期数量项目价格等。我想防止在列linestatus = RELELASED时允许开始和结束日期为空。这是迄今为止我所做的更改陈述。我的问题是为什么这不工作?我已经证实,这张表没有任何这三项检查的当前实例。引用同一个表中的多个列的检查约束条件

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

什么错误被返回? DB2的平台和版本? – Charles

+0

10.5 DB2是版本和错误isDB2 SQL错误:SQLCODE = -544,SQLSTATE = 23512,则sqlerrmc = START_END_NOTNULL,DRIVER = 53年4月16日 [SQL状态:23512] –

+1

这错误表明现有的行不符合约束。 – Charles

回答

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 
     ) 
    );