[DB] PK는 수정이 가능할까?

2024. 9. 30. 09:36· Database
목차
  1. ✅ PK
  2. ✅ PK 수정이 가능한 조건 
  3. ✅ 하지만 PK 수정은 왠만하면 하지말자!
  4. 🔥 PK 수정으로 인해 FK에 영향을 미친다
  5. 🔥 PK 수정으로 인한 index 재정렬 
  6. 🔥 외부와의 참조가 깨질 수 있다
  7. 🔥 몇몇 RDBMS에서는 `CASCADE UPDATE`를 지원하지 않는다
  8. ✅  참고 자료 & 링크
728x90

이 글은 공부를 하면서 알게 된 내용들을 기록하는 글 입니다. 오류나 고쳐야 할 사항들이 있다면 지적 부탁드립니다!

✅ PK

Primary key, PK는 테이블 내의 레코드들을 unique 하게 식별하기 위해 사용되는 key입니다.

다른 레코드들과의 중복 값과 NULL 값을 허용하지 않으며, PK는 FK(외래 키)를 통해 참조되기도 합니다.

 

지난번 포스팅을 통해 PK에 대해 알아보았는데요, 해당 포스팅에서 PK의 특징에 대해 이야기할 때 Unchanging이라고 이야기하며 값이 바뀌지 않아야 한다고 했습니다.

하지만 실제로 데이터베이스에 접속하여 PK의 값을 수정해도, DBMS에서는 'PK는 수정이 불가능합니다'와 같은 문구를 날리지 않습니다. 

수정을 하지 못하게 강제하고 있지 않은거죠.

 

어떻게 된 일인지, PK는 수정해도 되는 것인지 아닌지 알아보도록 하겠습니다.

 


✅ PK 수정이 가능한 조건 

먼저 PK를 수정하는 작업은 다음과 같은 조건을 만족하면 수행 가능합니다.

1️⃣ 변경하고자 하는 값을 지닌 PK가 없는 경우

2️⃣ 변경하고자 하는 값이 NULL이 아닌 경우 

3️⃣ 다른 테이블에서 FK로 사용되고 있지 않은 경우 

 

위의 조건을 만족한 경우 PK 수정이 가능합니다. 하지만 대부분의 경우 PK 수정을 권장하지 않습니다.

 


✅ 하지만 PK 수정은 왠만하면 하지말자!

하지만 일반적으로 PK 수정을 피하는 것을 권장합니다. 이유는 다음과 같습니다.

🔥 PK 수정으로 인해 FK에 영향을 미친다

다른 테이블들에서 해당 PK를 FK를 통해 사용하고 있는 경우, PK를 수정하면 FK의 값들까지 모두 수정해야 합니다.

PK 하나를 수정하는 작업이, 많은 테이블들의 레코드들을 수정하는 결과를 낳을 수 있고, 이로 인해 성능 저하가 발생할 수 있습니다. 

 

🔥 PK 수정으로 인한 index 재정렬 

특별한 설정을 따로 해주지 않는다면, 모든 테이블은 하나의 Clustered index를 갖게 됩니다.

Clustered index는 PK의 값을 기준으로 물리적으로 정렬이 되어 있는 tree의 구조를 가지고 있습니다. 

이 때, PK에 수정이 일어나면 변경된 값을 바탕으로 물리적으로 다시 정렬해야 합니다.

이 또한 무거운 작업이 될 수 있습니다.

 

🔥 외부와의 참조가 깨질 수 있다

PK는 레코드를 unique하게 식별할 수 있는 용도로 사용되기 때문에, 외부의 시스템(어플리케이션 캐시, 또 다른 DB)와 참조되어 있을 수 있습니다. 

이 때, PK를 수정한다면 이러한 참조가 깨질 수 있고, 이를 위해 별도의 조치가 필요합니다.

 

🔥 몇몇 RDBMS에서는 CASCADE UPDATE를 지원하지 않는다

PK를 수정했을 때 관련되어 있는 FK를 다 같이 수정하는 방법이 있습니다. 바로 CASCADE UPDATE입니다.

하지만 Oracle과 같은 몇몇 RDBMS에서는 CASCADE UPDATE를 지원하지 않습니다. 

 

 


✅  참고 자료 & 링크

- database - Can we update primary key values of a table? - Stack Overflow

- Can I change the primary key after a relationship in a database? - Quora

- ORACLE DB - ON UPDATE CASCADE (TRIGGER 사용해서 UPDATE 하기)

- database design - Why would a primary key value change? - Database Administrators Stack Exchange

728x90
  1. ✅ PK
  2. ✅ PK 수정이 가능한 조건 
  3. ✅ 하지만 PK 수정은 왠만하면 하지말자!
  4. 🔥 PK 수정으로 인해 FK에 영향을 미친다
  5. 🔥 PK 수정으로 인한 index 재정렬 
  6. 🔥 외부와의 참조가 깨질 수 있다
  7. 🔥 몇몇 RDBMS에서는 `CASCADE UPDATE`를 지원하지 않는다
  8. ✅  참고 자료 & 링크
'Database' 카테고리의 다른 글
  • [DB] Foreign Key(FK)에 NULL이 들어갈 수 있을까?
  • [Database] 데이터베이스의 Key 종류
  • [Database] RDB와 NoSQL의 차이점
HEY__
HEY__
안녕하세요 :) 공부하며 배운 것들을 기록하기 위한 블로그입니다. 도움이 되시길 바라며 혹시 잘못된 점이 있다면 댓글 부탁드립니다! :D
250x250
HEY__
while(true) { continue; }
HEY__
전체
오늘
어제
  • 분류 전체보기 (164)
    • Spring Boot (45)
      • 스프링 입문 강의 (18)
    • AWS (8)
    • 프로젝트 (6)
    • Network (21)
    • Operating System (8)
    • Database (4)
    • ETC (2)
    • Java (3)
    • C++ (7)
    • Python (1)
    • 도서 📚 (3)
      • Effective Java (3)
    • Coding test (50)
      • Baekjoon (30)
      • Leet Code (18)
      • Programmers (2)
    • Algorithm (C++) (5)

블로그 메뉴

  • 태그
  • Github
  • 글쓰기
  • 블로그관리

공지사항

인기 글

태그

  • Java
  • HTTP
  • leetcode
  • coding test
  • aws
  • STL
  • programmers
  • Algorithm
  • CPP
  • Spring
  • spring boot
  • slack
  • Baekjoon
  • OS
  • kotlin
  • Servlet Container
  • C++
  • Network
  • dispatcher servlet
  • Cloudfront

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
HEY__
[DB] PK는 수정이 가능할까?
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.