2009-06-21 7 views
2

고유 제약 조건을 적용하려는 Oracle 데이터베이스 테이블이 있습니다. 문제는 그 테이블의 열이 null 인 경우에만 제약 조건을 적용하려는 것입니다.where와 함께 오라클의 고유 제약 조건

예. 행에 deleted_date 열이 없으면 제한 조건을 적용하고 그렇지 않으면 무시하십시오. 이렇게하면 레코드를 부드럽게 삭제하고 해당 레코드에 대한 제약 조건을 무시할 수 있습니다.

이 작업을 수행하는 방법에 대한 의견이 있으십니까?

건배, 마크

답변

6

그냥 다중 열 제약 만들 - 당신이 고유 할 열 플러스 삭제 날짜를. 삭제되지 않은 모든 행은 고유 한 값을 가지며 삭제 날짜는 null입니다. 삭제 된 모든 행은 삭제 날짜로 인해 고유합니다 (타임 스탬프이고 해상도가 모든 삭제를 분리 할만큼 충분히 좋다는 가정하에). 삭제 된 행을 삭제 날짜별로 분리 할 수없는 경우 새 열을 만들고이를 제약 조건에 추가하여 삭제 날짜를 고유하게 만드는 방법을 생각해 볼 수 있습니다. 그러나 이는 매우 비 숙련 된 솔루션입니다.

+0

남자, 나는 이것을 생각하려고 애 쓰고있었습니다! 고마워, 그건 내 생각에 괜찮을거야 – Mark

4

해상도가 충분하지 않은 경우 고유 한 기능 기반 색인을 만들 수 있습니다.

예 :

SQL> create table t (id,col,deleted_date) 
    2 as 
    3 select 1, 99, null from dual union all 
    4 select 2, 99, date '2009-06-22' from dual 
    5/

Tabel is aangemaakt. 

SQL> alter table t add constraint t_pk primary key (id) 
    2/

Tabel is gewijzigd. 

SQL> alter table t add constraint t_uk1 unique (col,deleted_date) 
    2/

Tabel is gewijzigd. 

이 다니엘 기재된 해결책이다. 이 경우

SQL> insert into t values (3, 99, date '2009-06-22') 
    2/
insert into t values (3, 99, date '2009-06-22') 
* 
FOUT in regel 1: 
.ORA-00001: unique constraint (RWK.T_UK1) violated 

기반으로 고유 한 기능을 사용 : (여기에만 날짜 부분을 사용하고 있습니다) 두 개의 행이 동일한 시간에 삭제 될 가능성이 이제까지있는 경우,이 솔루션은 충분하지 않습니다 인덱스 :

SQL> alter table t drop constraint t_uk1 
    2/

Tabel is gewijzigd. 

SQL> create unique index i1 on t (nvl2(deleted_date,null,col)) 
    2/

Index is aangemaakt. 

SQL> insert into t values (3, 99, date '2009-06-22') 
    2/

1 rij is aangemaakt. 

감사 롭.

+0

+1 : 독특한 기능을 기반으로하는 인덱스는 아마 현재 받아 들여지는 대답보다 낫다. –