Unique 제약 조건 질문 0 6 2,749

by 한포 [2023.01.26 10:04:11]


안녕하세요.

특정 컬럼 Col1 에 Unique 속성을 부여하고자 하는데 [Col1 값 + 문자열] 과 같은 형태로 Unique를 걸 수 있는 방법이 있을까요?

이 문자열은 PK 컬럼의 앞 두글자 이며 이 글자는 AA, BB 밖에 없습니다. 

 

혹은 [Col1 값 + PK 컬럼 앞 두자리] 과 같은 형태로 Unique를 걸 수 있어도 무관할 것 같습니다.

 

by 마농 [2023.01.26 10:19:57]

가능은 합니다.
다만, 왜 그래야 하는지?
테스트 해봣는데. SUBSTR 함수를 이용해 
UNIQUE 인덱스 생성은 되는데.
제약조건으로 UNIQUE 를 직접 걸었더니 안되구요.
가상컬럼을 만든 후에 해당 가상컬럼을 이용한 제약조건 설정은 가능하네요.


by 마농 [2023.01.26 10:38:27]
-- TEST : Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production --
-- 인덱스만 생성 (가능)
CREATE UNIQUE INDEX uk_dept_1_1 ON dept_1(SUBSTR(dname, 1, 2), loc);
-- 제약설정 (오류)
ALTER TABLE dept_1 ADD CONSTRAINT uk_dept_1_2 UNIQUE (SUBSTR(dname, 1, 2), loc);
-- 가상컬럼 추가
ALTER TABLE dept_1 ADD dname_2 VARCHAR2(2) GENERATED ALWAYS AS (CAST(SUBSTR(dname, 1, 2) AS VARCHAR2(2)));
-- 가상컬럼을 이용한 제약설정 (정상)
ALTER TABLE dept_1 ADD CONSTRAINT uk_dept_1_3 UNIQUE (dname_2, loc);

 


by 한포 [2023.01.26 10:39:24]

우선, 제품 테이블이 있고 제품 테이블에는 PK인 제품 ID와 제품명 컬럼 등이 있습니다.

제품 ID의 구성은 [업체코드_숫자5자리] 와 같은 형태로 되어있고 업체코드의 구분은 제품 공급업체 2곳의 고유 코드 [AA]와 [BB]입니다. 해당 테이블에서 제품 공급업체와 관련된 컬럼은 없고 이는 가능한 추가하지 않고 싶습니다.

이런 상태에서 제품명을 저희는 unique하게 관리하고 있으며 [ABC] 라는 제품명은 AA 공급업체 에서도, BB 공급업체 에서도 받을 수 있기때문에 [AA_00001, ABC], [BB_00001, ABC] 를 허용하고 싶어서입니다.

말씀주신 내용을 구현할 수 있는 방법을 알 수 있을까요? 


by 한포 [2023.01.26 10:50:00]

이 경우에는 가상컬럼 추가와 제약설정을 같이해야하는 걸까요? 가상컬럼 추가는 별도의 스토리지를 차지하게 되나요..?

질문이 많은데 답변주셔서 감사합니다!


by 마농 [2023.01.26 10:42:59]
-- 제약 설정 없이 인덱스 생성만으로도 가능합니다.
CREATE UNIQUE INDEX uk_제품_업체_제품명 ON 제품(SUBSTR(제품ID, 1, 2), 제품명);

 


by 마농 [2023.01.26 10:52:31]

가상컬럼은 "가상"이라는 뜻 그대로 공간을 차지하지 않습니다.
다만, 인덱스를 생성하게 되면 인덱스는 공간을 차지할 듯 하네요.

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