Unique 제약 조건 질문 0 6 4,560

by 한포 [DB 모델링/설계] 제약조건 UK Unique Oracle [2023.02.08 17:23:04]


안녕하세요.

 

특정 Column에 a, b 라는 값이 있는데 값 [a]는 unique 하게 관리하고 b는 중복을 허용하고 싶은데 기술적으로 구현 가능한 방법이 있나요?

by 마농 [2023.02.08 17:40:49]

a, b 가 특정 컬럼에 들어가 있는 값인가요?
그렇다면 유니크하게 관리되어야 할 또 다른 컬럼 에 대한 질문이겠네요?
함수기반 유니크 인덱스를 통해 가능합니다.
해당 컬럼 및 값에 대한 예시자료 보여주세요.


by 한포 [2023.02.08 17:53:55]

설비 TABLE에 설비들 정보가 있고 해당 테이블에는 설비명 / 설비정보 / 사용가능_여부 컬럼이 있습니다.

해당 테이블에서 단 하나의 값만 사용가능_여부에 O가 들어갈 수 있고 X는 여러가지여도 상관없습니다. 이때 값 O는 2개를 허용하지 않지만 X는 2개 이상을 허용하는 방법을 알고자했습니다.

 

실제 사용하는 테이블에 PK, UK 외 제약조건이 많아 예시를 간략히 작성했습니다..

 


by 마농 [2023.02.08 18:00:06]

유니크해야할 항목이 "설비명" 인가요?
서술식 설명만으로는 의문만 많아집니다.
예시자료 몇건정도 보여주시는게 명확합니다.

CREATE UNIQUE INDEX uk_설비명 ON 설비(DECODE(사용가능_여부, 'O', 설비명));

 


by 한포 [2023.02.08 18:23:33]

아래 테이블과 설계하고자 하는 히스토리를 함께 말씀드립니다..

 

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 제약 조건을 푸는 것은 불가합니다.)

 


by jkson [2023.02.09 07:47:24]

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 데이터를 인서트하는 두 명령을 한 트랜잭션에서 처리합니다.


by 마농 [2023.02.09 09:18:42]
CREATE UNIQUE INDEX uk_xxx ON ttt(DECODE(use_yn, 'Y', eqp_name), DECODE(use_yn, 'Y', char_no));

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입