我第一次使用oracle,我有一个名为ExpenseReport的表,它存储有关费用的详细信息。
如果ERStatus ='PENDING',我希望Null可以用于ApprUserNo 任何帮助将不胜感激,我一直试图整理这个早上
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 :(得分:8)
您需要重新构建约束。
首先,如果您希望某个字段保留空值,而不管其他任何规则,它必须是可以为空的字段。
ApprUserNo NUMBER(10) NULL, -- No Check Constrain
其次,创建一个表示ApprUserNo不能为NULL的约束,除非ErStatus = 'PENDING'
CONSTRAINT ERStatus_Null_Exception CHECK (AppUserNo IS NOT NULL OR ERStatus = 'PENDING'),
答案 1 :(得分: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'))
请重新阅读Oracle手册中记录CREATE TABLE和SQL条件语法的章节。