데이터베이스를 운영하다 보면 동일한 데이터가 실수로 여러 번 삽입되는 문제가 자주 발생합니다. MySQL에서는 UNIQUE 제약 조건을 사용하면 이러한 중복 항목(Duplicate Entry)을 효과적으로 방지할 수 있습니다. 이 글에서는 실제 예제를 통해 UNIQUE 제약 조건을 적용하고 중복 삽입을 차단하는 방법을 단계별로 살펴보겠습니다.
1. 테스트용 테이블 생성
먼저 실습에 사용할 간단한 테이블을 만들어 보겠습니다. 아래 예제는 Id와 Name 두 개의 컬럼을 가진 테이블입니다.
mysql> create table DemoTable
(
Id int,
Name varchar(100)
);
Query OK, 0 rows affected (0.79 sec)
2. UNIQUE 제약 조건 추가하기
테이블 생성 후 ALTER TABLE 명령어를 사용하여 복합 UNIQUE 제약 조건을 추가할 수 있습니다. 여기서는 Id와 Name의 조합이 유일하도록 설정했습니다.
mysql> alter table DemoTable add constraint id_NameUnKey UNIQUE(Id,Name); Query OK, 0 rows affected (0.82 sec) Records: 0 Duplicates: 0 Warnings: 0
참고: 단일 컬럼에만 고유성을 부여하려면 UNIQUE(Id)처럼 하나의 컬럼만 지정하면 됩니다. 반면 위 예제처럼 두 컬럼을 함께 지정하면, 두 값의 조합이 동일한 경우에만 중복으로 판단됩니다. 즉, Id가 같아도 Name이 다르면 정상적으로 저장됩니다.
3. 중복 삽입 시 발생하는 오류 확인
이제 레코드를 삽입해 보겠습니다. 처음 두 건은 정상적으로 입력되지만, 세 번째 삽입 시도는 이미 존재하는 (11, 'John') 조합이므로 에러가 발생합니다.
mysql> insert into DemoTable values(11,'John'); Query OK, 1 row affected (0.18 sec) mysql> insert into DemoTable values(12,'John'); Query OK, 1 row affected (0.21 sec) mysql> insert into DemoTable values(11,'John'); ERROR 1062 (23000): Duplicate entry '11-John' for key 'id_NameUnKey'
ERROR 1062 (23000)은 MySQL에서 중복 항목이 UNIQUE 제약 조건에 위배되었음을 알리는 대표적인 오류 코드입니다. 덕분에 애플리케이션 수준에서 별도의 검사를 하지 않아도 데이터베이스 차원에서 중복이 자동으로 차단됩니다.
4. 저장된 데이터 확인
SELECT 문으로 테이블 내용을 조회하면 중복 없이 두 건의 데이터만 저장된 것을 확인할 수 있습니다.
mysql> select * from DemoTable;
실행 결과는 다음과 같습니다.
+------+------+ | Id | Name | +------+------+ | 11 | John | | 12 | John | +------+------+ 2 rows in set (0.00 sec)
추가 팁: 중복 처리 옵션 활용하기
중복 삽입 시 단순히 에러를 발생시키는 것 외에도 상황에 따라 유용한 옵션이 있습니다.
- INSERT IGNORE: 중복 데이터가 감지되면 에러 대신 해당 삽입을 조용히 무시합니다. (
INSERT IGNORE INTO DemoTable VALUES(11,'John');) - ON DUPLICATE KEY UPDATE: 중복이 발생했을 때 기존 행의 값을 업데이트합니다. 예를 들어 최신 정보로 갱신하고 싶을 때 유용합니다.
- REPLACE INTO: 중복 시 기존 행을 삭제한 후 새로운 행을 삽입합니다. 다만 기존 데이터가 사라지므로 주의해서 사용해야 합니다.
마무리
UNIQUE 제약 조건은 데이터 무결성을 보장하는 가장 기본적이면서도 강력한 방법입니다. 테이블 설계 단계에서 어떤 컬럼(또는 컬럼 조합)이 유일해야 하는지 미리 정의해 두면, 애플리케이션 코드의 복잡성을 줄이고 중복 데이터로 인한 오류를 근본적으로 예방할 수 있습니다.