MySQL에서 중복 데이터 삽입을 막는 이유와 방법
데이터베이스를 운영하다 보면 동일한 데이터가 여러 번 저장되는 중복 행(Duplicate Rows) 문제가 자주 발생합니다. 중복 데이터는 저장 공간을 낭비할 뿐만 아니라, 조회 결과의 정확성을 해치고 통계 오류의 원인이 되기도 합니다.
MySQL에서는 UNIQUE 제약 조건을 사용하면 특정 컬럼(또는 컬럼 조합)에 대해 중복 값의 입력을 원천적으로 차단할 수 있습니다. 이 글에서는 UNIQUE 제약 조건을 적용하는 방법과 실제 동작 결과를 단계별로 살펴보겠습니다.
UNIQUE 제약 조건 추가 문법
이미 생성된 테이블에 UNIQUE 제약 조건을 추가하려면 ALTER TABLE 문을 사용합니다. 기본 문법은 다음과 같습니다.
ALTER TABLE yourTableName ADD UNIQUE(yourColumnName1, yourColumnName2, ...N);
여러 개의 컬럼을 함께 지정하면 해당 컬럼들의 조합(combination)이 유일해야 한다는 의미가 됩니다. 즉, 각 컬럼의 값이 개별적으로 달라도 조합 전체가 같으면 중복으로 판단됩니다.
예제 테이블 생성하기
문법을 이해하기 위해 먼저 예제용 테이블을 생성해 보겠습니다.
mysql> create table avoidInsertingDuplicateRows
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> FirstValue int,
-> SecondValue int
-> );
Query OK, 0 rows affected (0.53 sec)위 쿼리는 다음과 같은 구조를 가진 테이블을 만듭니다.
- Id: 자동 증가(AUTO_INCREMENT)되는 기본 키
- FirstValue: 첫 번째 정수 값
- SecondValue: 두 번째 정수 값
테이블 구조 확인하기
DESC 명령어로 테이블 구조가 올바르게 생성되었는지 확인합니다.
mysql> desc avoidInsertingDuplicateRows;
실행 결과는 다음과 같습니다.
+-------------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+---------+------+-----+---------+----------------+ | Id | int(11) | NO | PRI | NULL | auto_increment | | FirstValue | int(11) | YES | | NULL | | | SecondValue | int(11) | YES | | NULL | | +-------------+---------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)
UNIQUE 제약 조건 적용 후 중복 삽입 테스트
이제 두 컬럼(FirstValue, SecondValue)의 조합에 대해 UNIQUE 제약 조건을 설정하고, 동일한 값을 두 번 삽입해 보겠습니다.
mysql> insert into avoidInsertingDuplicateRows(FirstValue,SecondValue) values(10,20); Query OK, 1 row affected (0.24 sec) mysql> insert into avoidInsertingDuplicateRows(FirstValue,SecondValue) values(10,20); ERROR 1062 (23000): Duplicate entry '10-20' for key 'FirstValue'
실행 결과를 보면 첫 번째 INSERT 문은 정상적으로 수행되었지만, 두 번째 INSERT 문은 ERROR 1062 (23000) 오류와 함께 실패했습니다. 이는 (10, 20)이라는 값 조합이 이미 존재하기 때문입니다. MySQL이 UNIQUE 제약 조건 덕분에 중복 행의 삽입을 자동으로 차단한 것입니다.
저장된 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회하여 중복 데이터 없이 하나의 행만 저장되었는지 확인합니다.
mysql> select *from avoidInsertingDuplicateRows;
실행 결과:
+----+------------+-------------+ | Id | FirstValue | SecondValue | +----+------------+-------------+ | 1 | 10 | 20 | +----+------------+-------------+ 1 row in set (0.00 sec)
추가로 알아두면 좋은 팁
INSERT IGNORE 사용하기
중복 데이터가 입력될 때 오류 대신 조용히 무시하고 싶다면 INSERT IGNORE를 사용할 수 있습니다. 이 경우 중복 행은 삽입되지 않으며 에러도 발생하지 않습니다.
INSERT IGNORE INTO avoidInsertingDuplicateRows(FirstValue, SecondValue) VALUES(10, 20);
ON DUPLICATE KEY UPDATE 사용하기
중복이 발생했을 때 기존 행을 업데이트하고 싶다면 ON DUPLICATE KEY UPDATE 절을 활용하면 됩니다.
INSERT INTO avoidInsertingDuplicateRows(FirstValue, SecondValue) VALUES(10, 20) ON DUPLICATE KEY UPDATE SecondValue = 30;
마무리
MySQL에서 중복 행 삽입을 방지하는 가장 확실한 방법은 UNIQUE 제약 조건을 설정하는 것입니다. 상황에 따라 INSERT IGNORE나 ON DUPLICATE KEY UPDATE를 함께 활용하면 오류 처리까지 유연하게 관리할 수 있습니다. 데이터 무결성을 지키기 위해 테이블 설계 단계부터 중복 방지 전략을 고려하는 것이 좋습니다.