2016-12-05 106 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 
     ) 
    );