
DB에는 중요한 속성 하나가 있다. 바로 key다. 그 중에서도 기본 키는 유일성과 최소성을 만족하며 선택된 key로 null과 중복이 안된다. 그런데 MySQL에서 기본키를 설정하지 않아도 테이블이 만들어진다고 한다?! 지금까지 자동으로 _id 필드 생성해주는 MongoDB만 판 사람으로써 3초 동안 무슨 말인지 이해가 안됐다. 아니 왜 기본키를 설정하지 않고... 아... 권장사항이지 필수가 아니라고요... 하지만... 실무에서 그러면 모가지 아닌가요? 이거 맞아요...? 당황스러운만큼 새로운 사실에 흥미를 느껴서 한 번 정리해보고자 한다.
기본키 없이 테이블 만들어보기
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
email VARCHAR(100),
age INT,
created_at DATETIME
);
MySQL에서는 기본키를 줄 땐 PRIMARY KEY를 주면 된다. AUTO_INCREMENT까지 주면 자동으로 시퀀스 번호를 할당한다. 이게 우리가 처음 테이블을 만들 때 기계적으로 적었던 것이다. 자, 그렇다면 여기에서 PRIMARY KEY 뺀다면 어떻게 될까?

놀랍게도 생긴다! 아무런 문구도 없이... 이 정도면 호러 아닌가...? 왜냐하면 중복이 가능하잖아 😱 꺄아아아아 삭제, 수정할 때 어떻게 할건데...! 놀랍게도 MySQL 말고도 Oracle, PostgreSQL, SQL Server 등 대다수 RDBMS가 기본키 없이 테이블 생성이 가능하다고 한다.
기본 키 대신 UNIQUE 사용하기!
곰곰히 생각해봤다. 어째서 대부분의 RDBMS에서는 권장 할 뿐 필수가 아닐까? 가장 먼저 든 생각은 유연성이라고 생각한다. 개발자가 "선택"할 수 있는 건 좋으니깐.

그러나 난 무조건 기본 키가 있어야 한다고 생각했다. 중복은 어떻게 하고, 참조는 어떻게 할 것인지 이해가 되지 않았기 때문이다. 하지만 이 생각은 위 글을 보고 나서 다시 한 번 생각하게 됐다. 첫 문장부터 파격적이다. 각 테이블마다 하나의 키를 "기본" 키로 지정한다는 아이디어가 불필요하며, 시대에 뒤떨어졌으며, 여러면에서 도움이 되지 않는다고 한다.
그래서 저 사람은 "PRIMARY KEY"라는 용어를 폐기하자고 제안한다. 대신 모든 키를 동등하게 취급하자고 한다. 이 말은 PRIMARY KEY 대신 UNIQUE를 쓰자는 말이다. 그렇다면 UNIQUE이 무엇일까? 컬럼 또는 컬럼 그룹의 값들이 유일성을 갖도록 보장하는 무결성 제약조건이다. PRIMARY KEY와 다른 점은 두가지다. 첫째, 테이블당 여러개의 UNIQUE 제약조건을 가질 수 있다. 둘째, Null 값을 포함할 수 있다.
CREATE TABLE users (
id INT UNIQUE NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
phone VARCHAR(20) UNIQUE
);
이런 UNIQUE가 어떻게 PRIMARY KEY을 대처할 수 있을까? 바로 값 중복을 허용하지 않기 때문이다. UNIQUE을 사용할 경우 위와 같이 다양한 UNIQUE 제약을 걸 수 있다. 이럴 경우 상황에 맞게 키를 선택할 수 있다. 또한 모든 키와 모든 무결성 제약조건이 동등하게 중요해진다. UNIQUE가 PRIMARY KEY를 대처 가능한가? 가능하다고 생각한다.
결론
찾아보니 개발자들마다 기본 키에 대한 의견이 분분해서 재미있다. 그동안 PRIMARY KEY가 "필수"라고 생각했던 내 생각이 달라졌다. 그렇다고 PRIMARY KEY를 인제 안 쓸거냐고 하면 개인 프로젝트에서는 그럴거 같다. 하지만 실무에서는 팀원들과 조율해보고 쓸지 말지를 결정할거 같다. 아마 둘 다 쓰지 않을까?
'Back Side > DBMS > MySQL' 카테고리의 다른 글
| 관계형 데이터베이스의 중간 테이블 (0) | 2025.04.13 |
|---|
댓글