후보 키(Candidate Key)란 무엇인가?
각 릴레이션(테이블)은 하나 이상의 후보 키를 가질 수 있습니다. 이 중 하나가 기본 키(Primary Key)로 선택되며, 모든 후보 키는 기본 키가 될 수 있는 자격을 갖추고 있습니다. 따라서 기본 키의 후보가 되는 키들을 후보 키(Candidate Key)라고 부릅니다.
MySQL에서 후보 키를 구현하려면 하나 이상의 컬럼을 UNIQUE 키로 설정하면 됩니다. 이렇게 지정된 키들은 후보 키의 역할을 하며, 해당 컬럼 조합의 중복 데이터 입력을 자동으로 차단합니다.
후보 키 구현 기본 구문
alter table yourTableName add unique key anyName(yourColumnName1,yourColumnName2);
실전 예제로 배우기
1단계: 테이블 생성
먼저 예제에 사용할 데모 테이블을 생성합니다.
mysql> create table DemoTable1400
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Name varchar(40),
-> Age int
-> );
Query OK, 0 rows affected (0.50 sec)여기서 Id 컬럼은 AUTO_INCREMENT 속성을 가진 기본 키로 설정되었습니다.
2단계: 후보 키(UNIQUE 키) 추가
다음 쿼리를 사용하여 Name과 Age 컬럼의 조합에 고유 제약조건을 추가합니다.
mysql> alter table DemoTable1400 add unique key name_age_unique(Name,Age); Query OK, 0 rows affected (0.67 sec) Records: 0 Duplicates: 0 Warnings: 0
이제 (Name, Age) 조합은 후보 키로 동작하며, 동일한 조합의 데이터는 더 이상 입력할 수 없습니다.
3단계: 데이터 삽입 및 중복 검증
INSERT 문으로 레코드를 삽입해 후보 키가 어떻게 작동하는지 확인해 보겠습니다.
mysql> insert into DemoTable1400(Name,Age) values('Chris',23);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable1400(Name,Age) values('Chris',23);
ERROR 1062 (23000): Duplicate entry 'Chris-23' for key 'name_age_unique'
mysql> insert into DemoTable1400(Name,Age) values('David',23);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable1400(Name,Age) values('Chris',24);
Query OK, 1 row affected (0.10 sec)주목할 점은 두 번째 INSERT 문입니다. ('Chris', 23) 조합이 이미 존재하기 때문에 "Duplicate entry" 오류(1062)가 발생했습니다. 반면 이름은 같지만 나이가 다른 ('Chris', 24), 또는 나이는 같지만 이름이 다른 ('David', 23) 조합은 정상적으로 삽입됩니다. 이것이 바로 복합 컬럼 후보 키의 동작 방식입니다.
4단계: 결과 확인
SELECT 문으로 테이블의 전체 레코드를 조회합니다.
mysql> select * from DemoTable1400;
위 쿼리는 다음과 같은 결과를 출력합니다.
+----+-------+------+ | Id | Name | Age | +----+-------+------+ | 1 | Chris | 23 | | 4 | Chris | 24 | | 3 | David | 23 | +----+-------+------+ 3 rows in set (0.00 sec)
정리
이 예제에서 Id는 기본 키로 각 행을 고유하게 식별하고, (Name, Age) 조합은 후보 키 역할을 수행하여 중복 데이터 입력을 차단합니다. 이처럼 MySQL에서는 UNIQUE 키 제약조건을 활용하면 별도의 복잡한 설정 없이도 후보 키를 손쉽게 구현할 수 있습니다.