2012-04-25 2 views
16

다른 열 값에 따라 [attribute] 열에 고유 제한 조건을 적용해야하는 경우가 있습니다.oracle db의 조건부 고유 제한

그래서 예를 들어, 나는

에 isDeleted는 null 또는 'Y'(활성 또는 삭제) 값을 가질 수 표 (ID, EID, 이름, isDeleted를)과 같은 테이블을 가지고 있고, 나는를 만들려면 EID에 대한 고유 제한 조건, ISDeleted = null 일 때만 ISDeleted, 동일한 id를 갖는 삭제 된 레코드가 여러 개인 경우주의하지 않습니다. EID는 null 값을 가질 수 있습니다.

저는 Oracle DB를 사용하고 있습니다.

답변

22

제약 조건을 만들 수 없습니다. 그러나 고유 한 기능 기반 색인을 작성할 수 있습니다. 이것은 Oracle이 NULL 값을 색인하지 않는다는 사실을 이용합니다. isDeletedNOT NULL 인 모든 행은 색인에 포함되지 않으므로 고유 제한 조건이 적용되지 않습니다.

CREATE UNIQUE INDEX one_not_deleted 
    ON table_name((CASE WHEN isDeleted IS NULL 
         THEN eid 
         ELSE null 
         END)); 
+0

'그렇지 않을 경우'는 무엇입니까? null 값을 삽입하거나 중복 된 레코드 삽입을 허용합니까? – D3V

+0

@SantoshPingale - Oracle 인덱스는 NULL 값을 인덱싱하지 않기 때문에 'ELSE NULL'은 인덱스에서 중복을 허용하는 행을 제외시킵니다. –