단일 컬럼 PK를 복수 컬럼으로 변경 0 5 2,629

by 쌩크 [Oracle 기초] PK [2017.03.15 11:10:08]


이틀간 구글링 끝에 포기하고 여기 팁게와 질답게를 검색했으나

답변을 찾지 못했습니다. 결국 질문글을 올리게 되었네요.

 

제가 한 작업은 굉장히 단순한데요.

테이블A가 있습니다.

 고객ID 컬럼과 관련 몇개 컬럼

 

ID EDIT_ID Photo
11112222  12345 Blob
11112223 12345 Blob

0. user_constraints 를 조회해 봤는데

    PK는 없고 ID에 대해 CK만 Not Null 조건으로 걸려있었습니다.

    (이게 PK가 없는 상태인지는 잘 모르겠습니다.)

 

1. 이 테이블A에 Type이라는 컬럼을 추가 했습니다.

   

TYPE  Number(2) default 0 not null

 

2. PK를 복합키로 생성했습니다. (컬럼 생성 직후에 유니크 인덱스 생성도 했습니다.)

Alter Table TABLE_A Drop Primary Key;

Alter Table TABLE_A Add Constraint TABLE_A_PK 
Primary Key(ID, TYPE);

 

3. User_Constraints, user_cons_columns 를 조회해 보니 PK 설정이 잘되어 있습니다. PK는 ID, TYPE 두개인 상태입니다.

 

4. TABLE_A의 내용은 아래 처럼 되었고

ID EDIT_ID Photo Type
11112222 12345 Blob 0
11112223 12345 Blob 0

 

5. 존재하던 ID에 대해 Type 을 달리해서 새 레코드 입력을 시도했습니다.

ID EDIT_ID Photo Type
11112222     2

 - 무결성 제약 조건에 위배된다.. 고 에러 납니다.

 - PK를 Disable 시키고 재시도 해봐도 동일한 에러가 납니다.

 

뭔가 제가 모르는 다른 얼개가 있는거 같습니다.

복합키로 PK를 재설정 했는데 이게 적용이 안되고 있는것 같습니다. 

뭐가 문제일까요?

 

by 쌩크 [2017.03.15 11:18:46]
  CREATE TABLE "XXX"."TABLE_A" 
   (	"ID" VARCHAR2(8) NOT NULL ENABLE, 
	"PHOTO" LONG RAW, 
	"EDIT_ID" VARCHAR2(5), 
	"WKDTE" DATE, 
	"the_Type" NUMBER(2,0) DEFAULT 0 NOT NULL ENABLE, 
	 CONSTRAINT "TABLE_A_PK" PRIMARY KEY ("ID", "the_Type")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT ........

참고로 스키마를 뽑아보니 위와 같이 되어 있네요.


by jkson [2017.03.15 11:29:35]

기존에 pk가 없다고 하셨는데 pk 대신 id에 unique index가 있었던 것 아닌가요?

무결성 제약 메시지가 뜰 때 어떤 제약조건에 위배되는지 떴을텐데.. 해당 제약조건이 무엇인지 확인해보세요.


by 쌩크 [2017.03.15 11:46:55]

아마도 그랬을겁니다.

제약 에러시 나오는 멘트에는 XXX.TABLE_A_PK 에 위배 된다고 나옵니다.

그래서 PK를 의심하고 있었는데 아무래도 인덱스 문제가 아닐까 해요.

이게 맞는지 모르겠는데 USER_CONSTRAINTS 에는 ID에 대해 CONSTRAINT_TYPE=C 로 들어가 있고 INDEX_NAME 컬럼은 비어 있는 상태입니다. 아무튼 기존 (묵시적) 키값에 대한 유니크 인덱스 조건이 존재하는게 아닌가 하는데.. 어떻게 찾는건지.. 


by 쌩크 [2017.03.15 12:10:13]

답변 감사합니다. ^^


by 쌩크 [2017.03.15 12:05:52]

USER_INDEXES 에서 생성된 인덱스를 확인했습니다.

기존 ID에 대해서 TABLE_A_PK 라는 인덱스 네임으로 생성되어 있었네요.

Constraint TABLE_A_PK는 인덱스로 다른 인덱스 TABLE_A_UK를 보고 있는 상태라

기존 인덱스 TABLE_A_PK를 삭제하니 정상 동작 하였습니다.

일단 인덱스 네임과 Constraint 네임이 동일한 것으로 들어가 있으니 에러 멘트만 봐서는 헛갈리는군요. 

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