데이터의 이력 관리를 위해 기존 테이블에 버전이라는 컬럼을 생성해서 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 [제품 테이블] (문서 아이디, 제품코드, 버전)