MySQL에서 이미 존재하는 레코드의 중복 삽입을 방지하려면 해당 컬럼에 UNIQUE INDEX(고유 인덱스)를 설정해야 합니다. 고유 인덱스가 적용된 컬럼에는 동일한 값을 다시 삽입할 수 없으며, 중복 데이터가 들어올 경우 MySQL은 오류를 반환합니다.
1. 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable ( Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, FirstName varchar(20) ); Query OK, 0 rows affected (0.30 sec)
2. 고유 인덱스 생성
다음은 'FirstName' 컬럼에 고유 인덱스를 생성하여, 존재하지 않는 레코드만 삽입되도록 만드는 쿼리입니다.
mysql> CREATE UNIQUE INDEX index_on_FirstName ON DemoTable(FirstName); Query OK, 0 rows affected (0.56 sec) Records: 0 Duplicates: 0 Warnings: 0
3. 레코드 삽입 및 중복 확인
이제 INSERT 명령으로 레코드를 삽입합니다. 고유 인덱스 덕분에 INSERT 명령은 존재하지 않는 레코드만 정상적으로 삽입되며, 동일한 값이 다시 들어오면 오류가 발생합니다.
mysql> insert into DemoTable(FirstName) values('Chris');
Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable(FirstName) values('Chris');
ERROR 1062 (23000): Duplicate entry 'Chris' for key 'index_on_FirstName'
mysql>
mysql> insert into DemoTable(FirstName) values('Robert');
Query OK, 1 row affected (0.04 sec)
mysql> insert into DemoTable(FirstName) values('Mike');
Query OK, 1 row affected (0.04 sec)
mysql> insert into DemoTable(FirstName) values('Robert');
ERROR 1062 (23000): Duplicate entry 'Robert' for key 'index_on_FirstName'
mysql>실행 결과를 보면 'Chris'와 'Robert'는 이미 테이블에 존재하기 때문에, 같은 값을 다시 삽입하려는 시도에서 ERROR 1062(중복 항목 오류)가 발생한 것을 확인할 수 있습니다.
4. 결과 확인
SELECT 문을 사용하여 테이블의 모든 레코드를 조회합니다.
mysql> select *from DemoTable;
위 쿼리는 다음과 같은 출력 결과를 생성합니다.
+----+-----------+ | Id | FirstName | +----+-----------+ | 1 | Chris | | 2 | Robert | | 3 | Mike | +----+-----------+ 3 rows in set (0.00 sec)
추가 팁: INSERT IGNORE 활용하기
오류로 작업이 중단되는 것을 원하지 않는다면 INSERT IGNORE INTO ... 구문을 사용할 수 있습니다. 이 경우 중복 레코드 삽입 시 오류 대신 경고만 발생하고, 나머지 삽입 작업은 계속 진행됩니다. 배치(batch) 작업처럼 여러 레코드를 한 번에 처리할 때 특히 유용합니다.