MySQL에서 여러 컬럼을 조합해 고유한 복합 키(Composite Key)를 만들려면 ADD UNIQUE 명령어를 사용하면 됩니다. 이렇게 생성된 유니크 제약 조건은 지정한 컬럼들의 값 조합이 테이블 내에서 중복되지 않도록 보장합니다.
기본 문법
ALTER TABLE yourTableName ADD UNIQUE yourUniqueName(yourColumnName1, yourColumnName2, ......N);
예제 테이블 생성
먼저 실습에 사용할 테이블을 생성해 보겠습니다. 다음 쿼리를 실행합니다.
mysql> CREATE TABLE makeCompositeKeyDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> StudentName varchar(40),
-> StudentAge int,
-> StudentGrade char(1)
-> );
Query OK, 0 rows affected (2.34 sec)위 테이블은 자동 증가하는 기본 키(Id)와 학생 이름(StudentName), 나이(StudentAge), 학년(StudentGrade) 컬럼으로 구성되어 있습니다.
테이블 구조 확인
DESC 명령어로 테이블 구조를 확인해 보겠습니다.
mysql> DESC makeCompositeKeyDemo;
실행 결과는 다음과 같습니다.
+--------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+-------------+------+-----+---------+----------------+ | Id | int(11) | NO | PRI | NULL | auto_increment | | StudentName | varchar(40) | YES | | NULL | | | StudentAge | int(11) | YES | | NULL | | | StudentGrade | char(1) | YES | | NULL | | +--------------+-------------+------+-----+---------+----------------+ 4 rows in set (1.65 sec)
현재는 Id 컬럼만 PRI(기본 키)로 설정되어 있고, 나머지 컬럼에는 어떤 키 제약도 없는 상태입니다.
복합 고유 키 추가하기
이제 StudentName, StudentAge, StudentGrade 세 컬럼을 조합한 복합 고유 키를 추가해 보겠습니다. 다음 쿼리를 실행합니다.
mysql> ALTER TABLE makeCompositeKeyDemo ADD UNIQUE Name_Age_Grade(StudentName, StudentAge, StudentGrade); Query OK, 0 rows affected (0.69 sec) Records: 0 Duplicates: 0 Warnings: 0
여기서 Name_Age_Grade는 생성되는 유니크 인덱스의 이름입니다. 이 제약 조건이 적용되면 세 컬럼의 값 조합이 완전히 동일한 레코드는 더 이상 삽입할 수 없습니다. 예를 들어 '홍길동, 20세, A'라는 조합의 학생이 이미 있다면, 같은 조합을 가진 새 레코드는 에러와 함께 거부됩니다.
변경 후 테이블 구조 확인
복합 고유 키가 정상적으로 적용되었는지 다시 한번 테이블 구조를 확인해 보겠습니다.
mysql> DESC makeCompositeKeyDemo;
실행 결과는 다음과 같습니다.
+--------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+-------------+------+-----+---------+----------------+ | Id | int(11) | NO | PRI | NULL | auto_increment | | StudentName | varchar(40) | YES | MUL | NULL | | | StudentAge | int(11) | YES | | NULL | | | StudentGrade | char(1) | YES | | NULL | | +--------------+-------------+------+-----+---------+----------------+ 4 rows in set (0.00 sec)
결과 분석
변경 후 StudentName 컬럼의 Key 항목이 MUL로 표시된 것을 확인할 수 있습니다. MUL은 해당 컬럼이 복합(멀티 컬럼) 인덱스의 첫 번째 컬럼임을 의미합니다. MySQL은 DESC 출력에서 복합 인덱스의 첫 번째 컬럼에만 MUL을 표시하며, 나머지 컬럼들은 비워 두지만 실제로는 세 컬럼 모두 하나의 유니크 인덱스에 포함되어 있습니다.
이처럼 ALTER TABLE과 ADD UNIQUE를 활용하면 기존 테이블에도 손쉽게 복합 고유 키를 추가하여 데이터 무결성을 강화할 수 있습니다.