본문 바로가기
BackEnd-Study/DB

[ORACLE] 하나의 테이블에 두개의 기본키

by ChaeLOTUS 2024. 10. 28.
728x90

 

 

이번 프로젝트에서 설문조사라는 파트를 맡아서 개발을 했었다. 첨에 이 부분이 상당히 복잡하고 어려웠다.ㅠㅠ

우선 테이블은 3개가 연결되어있다.

 

TOLL_INFO_TBL

TOLL_DETAIL_TBL

TOLL_RESULT_TBL

간단하게 설명하자면 TOLL_INFO_TBL은 설문 포맷의 질문에 관련된 내용이 들어가고

TOLL_DETAIL_TBL은 해당 질문에 대한 답변 항목들, 그리고 답변 유형 관련된 내용이,

TOLL_RESULT_TBL은 어떤 답변을 선택하였는지에 대한 내용이 들어있다.

세개의 테이블에는 TOLL_ID로 연결되어 있다.

 

기존 정상적으로 작동이 되었는데 DB 설정을 다시 하면서 TOLL_DETAIL_TBL 에서 에러가 났다.

무결성 에러가 나서 확인해보니 

기존 TOLL_DETAIL_TBL에는 TOLL_INFO_TBL에서 하나의 설문 질문이 생성되면 TOLL_ID가 부여가 된다.

만약 TOLL_ID가  120번이고 답변 항목은 3개라고 치자.

그럼 TOLL_DETAIL_TBL에는 TOLL_ID가 120번인 데이터가 3개 들어간다.

그런데  TOLL_ID가 PK가 되어 무결성에러가 나는것이다.

 

 

 

조언을 구해보니  TOLL_ID와 SORT_ORDER 이 두개를 PK키로 등록하라는 답변을 받았다.

두개를 하나의 PK키로 말이다.

 

 

 

 

여기 오라클 왼쪽 메뉴에 보면 인덱스라는 메뉴가 있다.

저것을 클릭하면 모든 테이블의 PK가 나온다.

PK가 등록되어져 있는 이름을 클릭하면 데이터가 나오는데 상단에 SQL 탭을 누르면 아래와 같은 쿼리가 보여진다.

  CREATE UNIQUE INDEX ""."" ON "SEOULLIBDEV"."TOLL_DETAIL_TBL" ("TOLL_ID") 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "" ;

 

지금 현재는 TOLL_ID하나만 PK로 등록되어 있는것을 볼 수 있다.

 

 

해당 PK키를 우선 지운다.

DROP INDEX TOLL_DETAIL_TBL_PK;

 

 

 

그리고 위의 PK 만드는 쿼리문을 복사해서 SORT_ORDER만 추가해서 그대로 다시 만들어주었다.

  CREATE UNIQUE INDEX ""."" ON "SEOULLIBDEV"."TOLL_DETAIL_TBL" ("TOLL_ID", "SORT_ORDER") 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "" ;

 

 

 

이렇게 수정하니깐 무결성 에러가 났던것이 TOLL_ID, SORT_ORDER 둘 중 하나만 다르게 값이 들어가면 되니

다시 정상적으로 동작했다.

 

728x90

'BackEnd-Study > DB' 카테고리의 다른 글

[ORACLE] union all로 조인한 테이블 특정 데이터 값 수정  (0) 2024.10.29
[MyBatis] WHERE 1=1  (0) 2024.04.03
CLOB  (0) 2024.03.30
char varchar varchar2 차이  (0) 2024.03.30