그래서 당신은 단지 기록이 LOC_ID, 날짜, 시간의 주어진 순열 취소 할 수없는 규칙을 적용 할 것입니다 무엇? 함수 기반 고유 인덱스를 사용하여이를 수행 할 수 있습니다.
SQL> select * from t34
2/
PK LOC_ID SOMEDATE SOMETIM CAN
---------- ---------- ---------- ------- ---
1 1 01/01/2010 10:00AM YES
2 1 01/01/2010 10:00AM YES
3 1 01/01/2010 10:00AM
SQL> insert into t34
2 values (4 , 1 , to_date('01/01/2010','DD/MM/YYYY') , '10:00AM', null)
3/
1 row created.
SQL>
이의 규칙을
SQL> rollback
2/
Rollback complete.
SQL> create unique index t34_uidx
2 on t34 (loc_id, somedate, some_time, nvl2(cancelled, pk, null))
3/
Index created.
SQL>
NVL2()
기능을 적용 할 인덱스를 구축하자의 경우 두 번째 인수를 반환 CASE의 특별한 형태입니다 :
이
은 우리가 피하고 싶은 것입니다 첫 번째 인수는 NOT NULL이며 세 번째 인수는 NOT NULL입니다. 이 인덱스는 기본 키이므로 고유하므로 PK col을 두 번째 인수로 사용합니다.
SQL> insert into t34
2 values (4 , 1 , to_date('01/01/2010','DD/MM/YYYY') , '10:00AM', null)
3/
insert into t34 values (4 , 1 , to_date('01/01/2010','DD/MM/YYYY') , '10:00AM', null)
*
ERROR at line 1:
ORA-00001: unique constraint (APC.T34_UIDX) violated
SQL>
출처
2010-07-30 15:32:42
APC
귀하의 예를 그들이 널 않는 한 그래서 지수가 취소됨의 중복 값을 허용 데이터는 PK = 2 인 행을 거부하지 않을 경우 PK = 4 행을 거부 할 근거가 없습니다. –
@Jonathan Leffler - 이길 수 있습니다. 같은 질문이있었습니다. – Thomas
예, PK = 2는 정상입니다. 취소 된 값은 같지만 동일한 locid, 날짜 및 시간에 대해 두 번 반복되는 null이 아닌 값을 가질 수 있습니다. –