2012-04-04 74 views
3

我正在使用oracle第一次,並且我有一個名爲ExpenseReport的表,用於存儲有關費用的詳細信息。ORACLE約束允許爲空值,如果

我想允許空值的ApprUserNo IF ERStatus =「PENDING」 任何幫助將不勝感激,我一直在想這一切上午

CREATE TABLE ExpenseReport 
(
    ERNo   NUMBER(10) NOT NULL, 
    ERDesc   VARCHAR2(255) NOT NULL, 
    ERSubmitDate DATE NOT NULL, 
    ERStatusDate DATE NOT NULL, 
    ERStatus  VARCHAR2(8) DEFAULT 'PENDING' NOT NULL, 
    SubmitUserNo NUMBER(10) NOT NULL, 
    ApprUserNo  NUMBER(10) NOT NULL CONSTRAINT BEN_Check CHECK (ERStatus LIKE('PENDING')), 
    UsersUserNo NUMBER(10) NOT NULL, 
    AssetAssetNo NUMBER(10) NOT NULL, 
    PRIMARY KEY (ERNo), 
    CONSTRAINT Check_ER_Date CHECK (ERStatusDate >= ERSubmitDate), 
    CONSTRAINT ERStatus_Null_Exception CHECK (IF ERStatus = 'PENDING',AppUserNo = NULLABLE), 
    CONSTRAINT ERStatus_Option CHECK (ERStatus = 'PENDING','APPROBED','DENIED') 
) 
+0

什麼問題了嗎? – 2012-04-04 10:23:30

+0

我需要ApprUserNo纔可以爲空只有當ERStatus ='Pending' – 2012-04-04 10:30:01

+0

我在嘗試執行此操作時遇到錯誤。 – 2012-04-04 10:30:27

回答

8

您需要重新組成您的約束。首先,如果你想要一個字段持有空值,不管其他規則如何,它必須是空字段。

ApprUserNo  NUMBER(10) NULL, -- No Check Constrain 

其次,創建一個約束,說ApprUserNo不能爲NULL,除非ErStatus = 'PENDING'

CONSTRAINT ERStatus_Null_Exception CHECK (AppUserNo IS NOT NULL OR ERStatus = 'PENDING'), 
+0

DEMS萬分感謝,你救了我的屁股!歡呼每一個人!非常喜歡。 – 2012-04-04 10:57:40

0

這應該這樣做排序:

CONSTRAINT ERStatus_Null_Exception 
    CHECK (ERStatus <> 'PENDING' AND AppUserNo IS NOT NULL) 


你也應該改變:
CONSTRAINT BEN_Check CHECK (ERStatus LIKE('PENDING'))

CONSTRAINT BEN_Check CHECK (ERStatus = 'PENDING')
因爲a)LIKE不是函數和b)沒有通配符的LIKE沒有意義。

然後,你這裏有另一個錯誤:
CONSTRAINT ERStatus_Option CHECK (ERStatus = 'PENDING','APPROBED','DENIED')
應該是
CONSTRAINT ERStatus_Option CHECK (ERStatus IN ('PENDING','APPROBED','DENIED'))

請重新閱讀該文檔爲CREATE TABLE和SQL條件語法在Oracle手冊中的一章。

+1

另外,使該字段在第一位可以爲空。 OP目前有它作爲'NOT NULL',這是奇怪的如果OP曾經想要NULL ... – MatBailie 2012-04-04 10:33:32

+0

@Dems:很好的捕獲,我沒有注意到列的定義,只是爲了表達式檢查約束。 – 2012-04-04 10:34:05

+0

另外,爲什麼不是你的第一個約束'(ERStatus ='PENDING'或AppUserNo IS NULL)'?我錯過了什麼嗎? *(很可能,很長的一週已經)* – MatBailie 2012-04-04 10:36:00