상세 컨텐츠

본문 제목

[MySQL] How to swap PK?

Log.Develop/DB

by bluayer 2020. 9. 16. 19:37

본문

서론

가끔 실제 환경에서 Database가 다운되거나 혹은 서버가 다운되거나 등의 이유로

DB의 무결성이 깨지게 되는 케이스가 존재한다.

임시방편적으로 무결성이 깨진 부분을 복구하는 건 서버 개발자 혹은 DBA의 몫인데,

그 과정에서 Record를 삽입하게 되고, 삽입한 레코드의 순서가 맞지 않는 상황이 발생하게 된다.

 

이런 상황을 맞닥뜨렸을 때 어떻게 대응할 것인가?

나는 처음 생각한 방법으로, PK를 swap하는 방법을 생각했다.

참고로 필자는 MySQL 5+, 엔진으로는 InnoDB를 사용했다.

MySQL 너무 어렵다...

 

미리 보는 결론

더보기

그리고 이 방법은 아주 처참하게 실패했다. 적어도 MySQL에서는.

간단히 말하자면, swap을 PK할 수는 없다.

그렇기 때문에 PK를 제외한 다른 컬럼들의 값을 swap해주면 PK를 swap한 것처럼 보이게 된다!!!

 

본론

시도한 방법 1)

UPDATE 쿼리를 두 번 작성한다.

 

결론 1)
그러나 이렇게 하면 Duplicate Key이기 때문에 PK의 unique성 때문에 실행되지 않는다.

 


 

시도한 방법 2)

같은 테이블을 조인한 다음 각각 별칭을 주고, 각 PK를 동시에 UPDATE할 수 있게 한다.

 

결론 2)

동시에 한 테이블에 접근할 수 없다고 뜨며 에러를 뱉는다.

 


 

시도한 방법 3)

SET unique_checks = 0으로 만들고 업데이트를 시도한다.

 

결론 3)

1번과 같은 에러를 뱉는다...흑흑

 


 

시도한 방법 4)

transaction으로 묶고 실행시켜 본다. 

 

결론 4)

쿼리문에 따라 1번 혹은 2번과 같은 에러를 뱉는다!!

 


 

한 마디로 얘기하자면, stackoverflow에서 열심히 검색한 방법들은 다 작동하지 않았고(내 검색 능력의 부족일 수 있다.)

도저히 PK를 스왑할 수 없었다.

(심지어 transaction으로 하다가, end transaction을 안 해서 디비가 lock wait을 하는 대참사가 발생했다.

오류를 복구하려다가 오류를 더 만든 셈이 되어버렸다...)

 

결론

PK를 Swap하는 건 적어도 내가 시도한 환경과 방법에서는 불가능하다!!

그리고 이 방법은 아주 처참하게 실패했다. 적어도 MySQL InnoDB에서는, 또한 내가 시도한 방법들에서는..

간단히 말하자면, swap을 PK할 수는 없었다.

 

그러나!
PK를 제외한 다른 컬럼들의 값을 swap해주면 PK를 swap한 것처럼 보이게 된다는 깨달음을 얻었다!

결론적으로, PK를 제외한 다른 값들을 스왑하자!

 

+ 추가적으로, 최근 관계형 데이터베이스와 관련한 책을 읽고 있는데

이런 시도 자체가 관계형 DB스럽지 않은 방법이며, 릴레이션을 해칠 수 있는 방법인 것으로 보인다.

관련글 더보기

댓글 영역