2012-04-04 2 views
3

저는 처음으로 oracle과 협력하고 있습니다. 비용에 대한 세부 정보를 저장하는 ExpenseReport라는 테이블이 있습니다.ORACLE Null 값을 허용하는 제약 IF

은 내가이 그것을해야

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

문제는 무엇 ErStatus = 'PENDING' 않는 ApprUserNo는 NULL이 될 수 없다고 제약 조건을 만들? –

+0

ApprUserNo가 Nullable 일 때만 필요합니다. ERStatus = 'Pending' –

+0

실행하려고하면 오류가 발생합니다. –

답변

8

제약 조건을 다시 작성해야합니다.

먼저, 다른 규칙과 상관없이 필드가 null을 유지하기를 원하면 필드가 null 허용 필드 여야합니다.

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

둘째,

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

DEMS 고마워요, 내 엉덩이를 구 했어요! 모두에게 건배! 많은 사랑. –

0

이 모든 아침을 정렬하려고했는데, 널 (null)이 크게 감상 할 수 ApprUserNo IF ERStatus = 'PENDING' 어떤 도움을 허용 할 :

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')
) LIKE는 함수가 아니며 와일드 카드가없는 LIKE는 의미가 없으므로
CONSTRAINT ERStatus_Option CHECK (ERStatus = 'PENDING','APPROBED','DENIED')

CONSTRAINT ERStatus_Option CHECK (ERStatus IN ('PENDING','APPROBED','DENIED'))

이 표와 SQL 조건을 만들 구문을 기록한 오라클 설명서에 장을 다시 읽어 보시기 바랍니다해야합니다 :

은 그럼 당신은 여기에 다른 오류가 있습니다.

+1

또한 필드를 먼저 nullable로 설정하십시오. OP는 현재 OP가 'NOT NULL'로되어 있습니다. OP가 NULL을 원한다면 특이합니다 ... – MatBailie

+0

@Dems : 좋은 캐치, 열 정의에주의를 기울이지 않았습니다. 점검 제한 조건. –

+0

또한, 왜 첫 번째 제약이 없습니까 (ERStatus = 'PENDING'또는 AppUserNo IS NULL)? 내가 놓친 게 있니? * (매우 긴 주 벌써) * – MatBailie

관련 문제