[SQL] FOREIGN KEY가 있는 테이블 PRIMARY KEY 추가

 

데이터의 이력 관리를 위해 기존 테이블에 버전이라는 컬럼을 생성해서 PK를 추가해야 한다.

프로세스의 시작 역할을 하는 데이터를 이력관리 한다는것은 결국 연관 사이트 내의 모든 화면, 쿼리, 첨부파일까지 건드려야 하는 작업이 될 수밖에 없다.

내 연차에 해본 적 없는 신규 개발 건을 의견 취합해서 요건 분석하고 화면 설계하고 현재 사용중인 관련 테이블에 PK까지 추가하는 업무 분장을 나 혼자 해내야 하는 너무 과한 것 같다는... 생각은 우선 접어두고

 

 

* PK : PRIMARY KEY

* FK : FOREIGN KEY

 

PK를 새로 추가하기 위해서 일의 흐름은 이러하다.

1. 기존에 있는 PK와 FK, INDEX를 모두 DROP

2. 새 컬럼(버전)을 만든다. (이때 추가한 컬럼의 데이터를 채워 넣어줘야 PK를 걸 때 오류가 발생하지 않는다.)

3. 다시 PK와 FK, INDEX를 전부 생성하는 일을 해야 한다.

 

* PK INDEX는 PK를 생성하면 자동으로 생성이 되지만 FK는 자동생성이 되지 않아 쿼리를 직접 만들어 실행해야 한다.

 

 

테이블 구성

제품 마스터
문서 아이디(PK) ...

 

제품
문서 아이디(PK, FK) 제품코드(PK) 버전(PK) - 신규 ...

 

제품 기능
문서아이디(PK, FK) 제품 코드(PK, FK) 기능 코드(PK) 버전(PK, FK) - 신규 ...

 

위와 같이 생성해야 되는데 제품테이블에 FK가 걸려 있어 DROP 부분에서 애를 먹었다.

 

 

SELECT
	UC.CONSTRAINT_NAME
    , UC.TABLE_NAME
    , UCC.COLUMN_NAME
    , UC.CONSTRAINT_TYPE
    , UC.R_CONSTRAINT_NAME
FROM
	USER_CONSTRAINTS UC, USER_CONS_COLUMNS UCC
WHERE
	UC.CONSTRAINT_NAME = UCC.CONSTRAINT_NAME
	AND CONSTRAINT_TYPE = 'R';

 

 - P : Primary Key

 - R : Foreign Key

 - U : Unique

 - C : Not Null, Check

출처: https://smoh.tistory.com/168 [Simple is Beautiful.:티스토리]

 

 

위의 쿼리를 이용하여 제품테이블에 외래 키가 걸려있는 테이블을 찾아냈다.

 

그러면 FK가 DROP 되는 테이블도 알았고 쿼리만 작성하면 된다.

 

 

 

제품 테이블

-- 컬럼 추가 쿼리 생략 --

 

PK 삭제

ALTER TABLE [제품 테이블] DROP PRIMARY KEY CASCADE;

-- CASCADE 옵션은 외래키까지 삭제해주는 역할 (이로서 제품 기능 테이블의 외래키가 삭제 되었다.)

 

PK INDEX 삭제

DROP INDEX [ 제품테이블 PK 인덱스 이름];

 

PK 추가

ALTER TABLE [제품테이블] ADD CONSTRAINT [제품테이블 PK 인덱스 이름] PRIMARY KEY (문서 아이디, 제품코드, 버전)

 

 

 

제품 기능 테이블

-- 제품 테이블과 쿼리 유사하므로 쿼리 생략 --

 

FK 추가

ALTER TABLE [제품 기능 테이블] ADD CONSTRAINT [FK 인덱스 이름] FOREIGN KEY (컬럼명) REFERENCES [제품 테이블] (문서 아이디, 제품코드, 버전)