3-4 연습 문제 — 이 행을
정확히 가리킬 수 있나요
이번 강의에서 배운 것 — 중복 불가 · NULL 불가, 그리고 기본키는 하나지만 그걸 구성하는 컬럼은 1개일 수도 N개일 수도 있다는 것. 오늘도 SQL은 쓰지 않습니다. 대신 후보를 직접 고르고, 저장이 될지 안 될지 판정해 보세요.
섹션 3 에서의 위치
완료 ✓
강의 완료 ✓
지금 여기
테이블 사이를 잇는 값
2-4에서 만든 AI 과외 선생님 세션을 그대로 쓰세요. 기본키 문제는 “정답이 무엇인가” 보다 판단 기준이 중요합니다 — “이메일을 기본키로 쓰면 안 되는 이유를 중복·NULL 두 규칙으로 설명해줘” 처럼 물어보세요. 다 푼 뒤에는 본인의 근거를 적어 검증받는 게 가장 남습니다.
문제 1. 이 컬럼, 기본키로 써도 될까요
회원 테이블을 새로 만들면서 기본키 후보 네 개를 놓고 고민 중입니다. 각각 기본키로 적절한지 판단하고 이유를 붙여보세요.
| # | 후보 컬럼 | 값 예시 |
|---|---|---|
| ① | member_name — 회원 이름 | 김철수 |
| ② | phone — 휴대폰 번호 | 010-1234-5678 |
| ③ | email — 이메일 주소 | chulsoo@example.com |
| ④ | member_id — 회원 번호 | 1 |
두 가지만 물어보세요 — “이 값이 두 사람에게 똑같이 들어갈 수 있나?” 그리고 “이 값이 비어 있거나, 나중에 바뀔 수 있나?” 기본키의 두 규칙이 그대로 판단 기준입니다.
정답 보기
① member_name — 기본키로 부적절 ❌
동명이인이 언제든 생길 수 있습니다. 중복 불가 규칙을 지킬 수 없어요. 개명하면 값이 바뀐다는 것도 문제고요.
여기서 중요한 감각 하나 — 실제 shop 의 회원 20명에는 동명이인이 없습니다. 하지만 “지금 중복이 없다” 와 “앞으로도 중복될 수 없다” 는 완전히 다른 말입니다. 기본키는 뒤쪽이어야 해요.
② phone — 기본키로 부적절 ❌
번호를 바꾸는 사람도 있고, 해지한 번호는 다른 사람에게 다시 배정되기도 합니다. 게다가 아직 번호를 등록하지 않은 회원은 값이 비게 되죠 — NULL 불가 규칙에 걸립니다.
③ email — 기본키로 권하지 않음 △
중복이 잘 생기지 않는 편이라 ①·②보다는 낫습니다. 다만 이메일을 적지 않은 회원은 NULL 이 되고, 이메일을 바꾸는 사람도 있어요. 실무에서는 이메일에 중복만 막는 규칙을 따로 걸어두고, 기본키는 별도의 번호로 두는 편입니다.
④ member_id — 기본키로 적절 ✓
그 자체로는 아무 뜻이 없는 번호라서 바뀔 이유가 없습니다. 새 회원이 생길 때마다 새 번호를 붙이면 중복도 나지 않고, 비워둘 일도 없어요. 실제 shop 스키마가 정확히 이렇게 되어 있습니다 — PRIMARY KEY (member_id).
phone 과 email 컬럼은 실제 shop 스키마에 없습니다. 기본키 후보를
비교하기 위한 가상의 컬럼이에요. 실제 members 의 컬럼은 member_id ·
member_name · gender · age · joined_at 다섯 개입니다.
문제 2. 이 저장 시도는 성공할까요, 실패할까요
실제 members 테이블입니다. member_id가 기본키이고, 이미 1번부터 20번까지 저장돼 있어요. 여기에 새 회원을 저장하는 시도가 네 번 있었습니다.
이 문제에서는 member_id 의 자동 번호 매기기(AUTO_INCREMENT)를 잠시 꺼두고,
번호를 직접 지정해서 저장하는 상황이라고 가정합니다.
| # | member_id 에 넣은 값 | 무엇을 하려는 시도인가 |
|---|---|---|
| ① | 21 | 새 회원 '정하늘' 을 21번으로 저장 |
| ② | 3 | 새 회원 '한지우' 를 3번으로 저장 |
| ③ | (비움 · NULL) | 새 회원 '최유리' 를 번호 없이 저장 |
| ④ | 22 | 새 회원 '김철수' 를 22번으로 저장 (1번 회원과 이름이 완전히 같음) |
정답 보기
| # | 결과 | 이유 |
|---|---|---|
| ① | 저장 성공 | 21번은 아직 아무도 쓰지 않은 값입니다 |
| ② | 저장 실패 | 3번은 이미 박민수가 쓰고 있습니다 — 중복 불가 위반 |
| ③ | 저장 실패 | 기본키는 비울 수 없습니다 — NULL 불가 위반 |
| ④ | 저장 성공 | 이름이 같아도 상관없습니다 — 기본키가 보는 건 member_id 뿐 |
④가 오늘의 핵심입니다. 기본키는 “행 전체가 다른가” 를 검사하지 않습니다. 지정된 기본키 컬럼의 값만 봅니다.
그래서 22번 김철수와 1번 김철수는 이름이 똑같아도 서로 다른 행으로 나란히 저장됩니다. 그리고 나중에 둘 중 하나를 고쳐야 할 때 — member_id 로 정확히 한 명을 집어낼 수 있죠. 강의를 시작하며 던졌던 바로 그 문제가 이렇게 풀립니다.
실제 shop 의 member_id 는 AUTO_INCREMENT 라서, 번호를 생략하면
데이터베이스가 다음 번호를 알아서 붙여줍니다. 그래서 현실에서는 ③처럼
번호를 직접 비우는 일이 거의 없어요. 이건 데이터베이스가 값을 만들어주는 것이지
기본키에 NULL 이 저장되는 게 아닙니다 — 두 규칙은 그대로입니다.
문제 3 (도전). order_id 하나로는 왜 부족할까요
order_items 테이블의 앞부분입니다. 실제 shop 데이터예요.
| order_id | product_id | quantity |
|---|---|---|
| 1 | 1 | 1 |
| 1 | 16 | 2 |
| 2 | 22 | 1 |
| 3 | 9 | 1 |
| 3 | 11 | 1 |
세 가지에 답하세요.
order_id하나만으로는 기본키가 될 수 없습니다. 위 데이터의 실제 값을 근거로 이유를 설명하세요.- 그렇다면
product_id하나만으로는 어떨까요? 역시 실제 데이터로 논증하세요. - 어떤 수강생이 이렇게 말했습니다 — “
order_items는 기본키가order_id와product_id두 개다.” 이 문장의 어디가 틀렸는지 바로잡아 설명하세요.
중복 불가 규칙을 그대로 대입해 보세요 — “이 컬럼의 값이 두 행에 똑같이 들어 있는 경우가 실제로 있나?” 한 건이라도 있으면 그 컬럼은 단독으로 기본키가 될 수 없습니다.
정답 보기
1. order_id 단독으로는 불가 — 값이 실제로 중복됩니다
1번 주문 한 건에 (1, 1) 과 (1, 16) 두 행이 있습니다. order_id 값 1 이 두 행에 똑같이 들어 있죠. 중복 불가 규칙 위반입니다.
3번 주문도 마찬가지예요 — (3, 9) 와 (3, 11). 한 주문에 상품을 여러 개 담는 순간 order_id 는 반복될 수밖에 없습니다.
2. product_id 단독으로도 불가 — 같은 상품이 여러 주문에 들어갑니다
무선 이어폰(product_id 9)은 3번 주문에도 있고, 6번과 12번 주문에도 들어 있습니다. product_id 값 9 가 여러 행에 반복되니 역시 중복 불가 위반이에요.
| 기준 | 중복되는 실제 값 | 단독 PK 가능? |
|---|---|---|
| order_id | 1 → (1,1)·(1,16) / 3 → (3,9)·(3,11) | 불가 ❌ |
| product_id | 9 → 3번·6번·12번 주문에 모두 등장 | 불가 ❌ |
| (order_id, product_id) | 중복되는 쌍이 하나도 없음 | 가능 ✓ |
3. “기본키가 두 개”라는 표현이 틀렸습니다
order_items 의 기본키는 하나입니다. 그 하나를 order_id 와 product_id 두 컬럼이 함께 구성하는 것이고, 이런 기본키를 복합키라고 부릅니다.
한 테이블에 기본키는 언제나 하나만 지정할 수 있어요. 달라지는 건 기본키의 개수가 아니라 — 그 하나를 만드는 컬럼의 개수입니다. 테이블 정의를 보면 더 분명합니다.
보너스 — 이 복합키가 실제로 막아주는 것
같은 주문에 같은 상품이 두 줄로 들어갈 수 없습니다. 그래서 10번 주문은 프리미엄 그래놀라(product_id 16)를 세 개 샀지만 행은 하나예요 — (10, 16, 3). 행을 늘리는 대신 quantity 숫자를 올린 겁니다.
“PK 가 몇 개인가” 가 아니라 “PK 하나를 몇 개의 컬럼이 만드는가” 로 묻는 습관을 들이면 — 복합키는 더 이상 헷갈리지 않습니다.
다 풀었다면
처음 보는 테이블에서 “이 행을 무엇으로 정확히 가리킬 수 있지?” 를 먼저 묻게 됐고, 복합키를 보고도 “기본키는 하나”라고 말할 수 있다면 오늘 목표는 달성입니다.
DBeaver 좌측 트리에서 shop → Tables → members 를 더블클릭하고 Columns
탭을 열면 member_id 옆에 열쇠 표시가 붙어 있습니다. 이어서
order_items 도 열어보세요 — order_id 와 product_id 둘 다 열쇠가
붙어 있죠. 기본키가 두 개라는 뜻이 아닙니다. Constraints(제약) 항목을
펼치면 PRIMARY KEY 는 하나뿐이고 그 안에 두 컬럼이 들어 있는 걸 확인할
수 있어요. orders 도 열어서 member_id 에는 열쇠가 없다는 걸 눈으로
확인해보세요.
이제 한 행을 정확히 가리킬 수 있게 됐습니다. 그런데 orders 의 member_id 는 기본키도 아닌데 왜 거기 있을까요? 그건 다른 테이블의 기본키를 가리키는 값입니다. 다음 강의에서 테이블과 테이블을 잇는 이 값을 다룹니다.