2012-04-04 69 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