안녕하세요.
특정 Column에 a, b 라는 값이 있는데 값 [a]는 unique 하게 관리하고 b는 중복을 허용하고 싶은데 기술적으로 구현 가능한 방법이 있나요?
a, b 가 특정 컬럼에 들어가 있는 값인가요?
그렇다면 유니크하게 관리되어야 할 또 다른 컬럼 에 대한 질문이겠네요?
함수기반 유니크 인덱스를 통해 가능합니다.
해당 컬럼 및 값에 대한 예시자료 보여주세요.
아래 테이블과 설계하고자 하는 히스토리를 함께 말씀드립니다..
| EQP_NAME | PARAM | CHAR_NO | USE_YN |
| ABCD | 가나다 | 100 | Y |
| ABCD | 라마바 | 101 | Y |
| EFG | 가나다 | 100 | Y |
| EFG | 라마바 | 101 | Y |
위와 같은 테이블이 있습니다. EQP_NAME, PARAM은 PK 이고, EQP_NAME과 CHAR_NO는 UK로 잡혀있습니다.
그런데 현장에서 2번 행의 [라마바] 를 [아자차카] 로 변경하였고 명칭만 바뀐 것이기에 설비 특성인 CHAR_NO 는 똑같이 가져가면서 PARAM [아자차카] 로 변경하려고 합니다.
하지만 해당 ROW가 PK 이기에 [ABCD, 라마바, 101, Y] 행에서 USE_YN(사용여부) 컬럼을 N 으로 바꾸고 [ABCD, 아자차카, 101, Y]를 추가하려고 합니다. 이 경우에는 UK가 문제가 되어 UK를 [EQP_NAME, PARAM, USE_YN] 3 가지로 선택하고자 했습니다. 이 경우에 [ABCD, 아자차카, 101, Y] 은 정상적으로 추가가 될 것 같습니다.
하지만, 이후 시간이 또 지나 [ABCD, 아자차카, 101, Y] PARAM 명칭이 또 바뀌어 해당 행의 USE_YN을 N 처리 하려고 하면 UK 제약조건에 걸리게 됩니다.
따라서 생각한 방법이 Y는 하나만 있되, N은 복수를 허용하는 방법을 생각했습니다. (Unique 제약 조건을 푸는 것은 불가합니다.)
유니크해야할 항목이 "설비명" 인가요?
서술식 설명만으로는 의문만 많아집니다.
예시자료 몇건정도 보여주시는게 명확합니다.
CREATE UNIQUE INDEX uk_설비명 ON 설비(DECODE(사용가능_여부, 'O', 설비명));
설비 TABLE에 설비들 정보가 있고 해당 테이블에는 설비명 / 설비정보 / 사용가능_여부 컬럼이 있습니다.
해당 테이블에서 단 하나의 값만 사용가능_여부에 O가 들어갈 수 있고 X는 여러가지여도 상관없습니다. 이때 값 O는 2개를 허용하지 않지만 X는 2개 이상을 허용하는 방법을 알고자했습니다.
실제 사용하는 테이블에 PK, UK 외 제약조건이 많아 예시를 간략히 작성했습니다..
EQP_NAME, PARAM이 PK이지만 PARAM이 변경될 가능성이 있는 컬럼이라 현재 상태로는 변경 전 데이터와 변경 후 데이터가 PK로 관리되기 어려워 보이네요.
그리고 EQP_NAME과 CHAR_NO가 꼭 UK로 관리되어야 하는지도 검토해봐야할 것 같습니다.
말씀하신 내용만 보면 EQP_NAME, CHAR_NO UK를 없애고 EQP_NAME, CHAR_NO 그리고 추가로 SEQ라는 컬럼을 두어 이 세 컬럼을 PK로 두는 게 어떨까요?
이렇게 PK를 지정한다면
EQP_NAME/CHAR_NO/SEQ/PARAM/USE_YN
ABCD 101 1 라마바 Y
->
ABCD 101 1 라마바 N
ABCD 101 2 아자차카 Y
이런 형태로 데이터가 관리되어야 할 것 같습니다.
보통은 이런 경우 ABCD 101 1의 USE_YN을 N으로 업데이트하고 ABCD 101 2 Y 데이터를 인서트하는 두 명령을 한 트랜잭션에서 처리합니다.
CREATE UNIQUE INDEX uk_xxx ON ttt(DECODE(use_yn, 'Y', eqp_name), DECODE(use_yn, 'Y', char_no));