MySQL에서 두 개 이상의 열을 하나의 그룹으로 묶어 고유한 값 조합을 강제하고 싶다면 ALTER TABLE 명령어와 UNIQUE 제약 조건을 함께 사용하면 됩니다. 복합 유니크 키(composite unique key)라고도 불리는 이 기능은, 예를 들어 '이름 + 전화번호'처럼 각각은 중복될 수 있지만 두 값의 조합 자체는 중복되면 안 되는 경우에 매우 유용합니다.
기본 문법
ALTER TABLE yourTableName ADD UNIQUE yourUniqueName(yourColumnName1, yourColumnName2, ...N);
제약 조건 이름을 직접 지정할 수 있으며, 괄호 안에 나열된 열들의 조합이 테이블 전체에서 유일해야 한다는 규칙이 적용됩니다.
1단계: 예제 테이블 생성
먼저 실습에 사용할 테이블을 만들어 보겠습니다.
mysql> CREATE TABLE DemoTable
(
StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentFirstName varchar(100),
StudentLastName varchar(100),
StudentAge int,
StudentPhoneNumber varchar(20)
);
Query OK, 0 rows affected (0.81 sec)2단계: 두 열에 UNIQUE 제약 조건 추가
이제 StudentFirstName과 StudentPhoneNumber 두 열의 조합을 고유하게 만들어 보겠습니다.
mysql> ALTER TABLE DemoTable ADD UNIQUE DemoTable_unique_StudentFirstName_StudentPhoneNumber(StudentFirstName, StudentPhoneNumber); Query OK, 0 rows affected (0.40 sec) Records: 0 Duplicates: 0 Warnings: 0
명령이 성공적으로 실행되면, 이후부터는 같은 이름이라도 전화번호가 다르면 저장할 수 있지만, 이름과 전화번호가 모두 동일한 데이터는 입력할 수 없게 됩니다.
3단계: 데이터 삽입으로 동작 확인
레코드를 몇 개 삽입해 보겠습니다.
mysql> INSERT INTO DemoTable(StudentFirstName, StudentLastName, StudentAge, StudentPhoneNumber) VALUES('John','Doe',21,'9878567878');
Query OK, 1 row affected (0.18 sec)
mysql> INSERT INTO DemoTable(StudentFirstName, StudentLastName, StudentAge, StudentPhoneNumber) VALUES('John','Smith',23,'7654674545');
Query OK, 1 row affected (0.14 sec)첫 번째와 두 번째 레코드는 이름이 'John'으로 같지만 전화번호가 다르므로 정상적으로 삽입됩니다. 하지만 이름과 전화번호가 모두 첫 번째 레코드와 동일한 데이터를 삽입하면 어떻게 될까요?
mysql> INSERT INTO DemoTable(StudentFirstName, StudentLastName, StudentAge, StudentPhoneNumber) VALUES('John','Brown',21,'9878567878');
ERROR 1062 (23000): Duplicate entry 'John-9878567878' for key 'DemoTable_unique_StudentFirstName_StudentPhoneNumber''John-9878567878' 조합이 이미 존재하기 때문에 ERROR 1062 (Duplicate entry) 오류가 발생하며 삽입이 거부됩니다. 이것이 바로 복합 UNIQUE 제약 조건이 정상적으로 작동하고 있다는 증거입니다.
4단계: 최종 결과 확인
SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.
mysql> SELECT * FROM DemoTable;
실행 결과는 다음과 같습니다.
+-----------+------------------+-----------------+------------+---------------------+ | StudentId | StudentFirstName | StudentLastName | StudentAge | StudentPhoneNumber | +-----------+------------------+-----------------+------------+---------------------+ | 1 | John | Doe | 21 | 9878567878 | | 2 | John | Smith | 23 | 7654674545 | +-----------+------------------+-----------------+------------+---------------------+ 2 rows in set (0.00 sec)
정리
이처럼 MySQL에서 여러 열의 조합에 고유성을 부여하는 것은 ALTER TABLE ... ADD UNIQUE 구문 하나로 간단하게 처리할 수 있습니다. 핵심 포인트를 요약하면 다음과 같습니다.
- 개별 열이 아니라 열 조합 전체가 유일성 검사의 대상이 됩니다.
- 이미 중복된 데이터가 있는 상태에서 제약 조건을 추가하면 오류가 발생하므로, 적용 전에 데이터 정합성을 먼저 점검해야 합니다.
- NULL 값은 유니크 검사에서 서로 다른 값으로 취급되므로, 필요하다면 해당 열을 NOT NULL로 설정하는 것이 좋습니다.