기본키는 수정이 가능한가요?
기술적으로는 가능하지만, 실무에서는 절대 하지 않는 것이 원칙입니다.
기본키 수정이 위험한 이유
-- user 테이블
| id | email |
|----|---------------|
| 1 | kim@test.com |
-- orders 테이블 (FK 참조 중)
| order_id | user_id |
|----------|---------|
| 101 | 1 |
| 102 | 1 |
-- id = 1 을 id = 99 로 변경 시도
UPDATE user SET id = 99 WHERE id = 1;
-- X FK 제약조건 위반 에러
-- orders.user_id = 1 이 참조하는 대상이 사라지기 때문
ON UPDATE 옵션으로 가능하긴 함
FOREIGN KEY (user_id) REFERENCES user(id)
ON UPDATE CASCADE -- PK 변경 시 FK도 자동으로 따라서 변경
-- CASCADE 설정 시
UPDATE user SET id = 99 WHERE id = 1;
-- orders 테이블도 자동 변경됨
| order_id | user_id |
|----------|---------|
| 101 | 99 | ← 자동 변경
| 102 | 99 | ← 자동 변경
그럼에도 하지 않는 이유
| 이유 | 설명 |
|---|---|
| 참조 무결성 위험 | CASCADE 미설정 시 FK 에러 |
| 성능 저하 | 참조 테이블이 많을수록 연쇄 UPDATE 비용 증가 |
| 캐시 불일치 | Redis 등 캐시에 저장된 PK 값이 남아있음 |
| 로그 추적 불가 | 변경 전 PK로 기록된 로그가 무의미해짐 |
결론
기본키는 불변(Immutable) 이어야 한다. 이것이 실무에서 비즈니스 의미 없는 대리키(AUTO_INCREMENT, UUID) 를 선호하는 가장 큰 이유입니다.
자연키(이메일, 주민번호 등)는 언제든 변경될 수 있지만, 대리키는 변경될 이유 자체가 없기 때문입니다.