본문 바로가기
서버/Mysql

Insert ignore 중복 레코드 관리

by 코딩히어로 2022. 5. 10.
728x90

Mysql Database를 인수인계받아 데이터를 입력하는 도중

primary key로 구성됬지만 로그를 남기는 이상한 구조를 발견했습니다

 

Serial Sensor_name Date Mvalue Cvalue Alarm
PK PK PK      

 

해당 테이블은 Serial, Sensor_name, Date 세 개의 PK로 구성되어 있으며

실시간으로 들어오는 Sensor Value를 기록하는 담당입니다.

 

여기에서 문제가 되는점은 기존 레코드에서 다음과 같이 insert 하면 Primary Key에 의해

insert 구문이 실행되지 않는다는 점입니다.

 

insert into Table(Serial, Sensor_name, Date, Mvalue, Cvalue, Alarm) values('aa123', 'Temp', '20220510 09:00', '11.5', '11.6', 'Y');

 

해당 구문은 Duplicate entry 에러가 발생하고 pk문제라고 명시하고 있습니다

그렇다면 PK로 구성된 테이블을 로그로 사용하는것은 불가능한 것일까요?

그리고 왜 이전 DB설계자는 왜이런식의 구조를 설계한 것일까요

 

여러 가지 방면을 찾아보다가 해답을 찾은 것은 바로 중복처리였습니다

 

INSERT IGNORE

 

중복 키 에러가 발생했을 때 신규로 입력되는 레코드를 무시하는 방법이라고 소개되어

있는 이 기능은 위에서 발생한 에러를 발생시키지 않고 무시해줍니다

 

그냥 단순히 에러를 무시하는 것인데 어떻게 위 구조에 대한 해결방법이 될까요

바로 INSERT IGNORE 구문은 PK 항목을 검사하여 같다면 무시하고 다르다면 입력시켜 줍니다

 

PK 항목이 다르다면이 핵심인데

중요한 것은 IGNORE은 PK 항목이 몇 개든지 전체 PK항목 중에 하나라도 다르면 다른 것으로 인지한다는 것입니다

 

즉 Serial, Sensor_name, Date 3개의 PK 항목이 있는데 이 3가지를 하나로 묶어서

한 항목이라도 다르면 다른것으로 인지한다는 것입니다

 

Serial Sensor_name Date Mvalue Cvalue Alarm
aa123 Temp 20220510 09:00 12.0 12.1 Y
Serial Sensor_name Date Mvalue Cvalue Alarm
aa123 Temp 20220510 09:01 12.0 12.1 Y

 

위 두 개의 항목은 Date 부분이 다르므로 IGNORE로 봤을 때 다르다는 것입니다

즉 Date 항목이 다르기 때문에 Serial, Sensor_name이 PK이지만 값이 같아도 insert가 가능합니다

 

insert ignore into Table(Serial, Sensor_name, Date, Mvalue, Cvalue, Alarm) values('aa123', 'Temp', '20220510 09:00', '11.5', '11.6', 'Y');
insert ignore into Table(Serial, Sensor_name, Date, Mvalue, Cvalue, Alarm) values('aa123', 'Temp', '20220510 09:01', '11.5', '11.6', 'Y');

 

INSERT IGNORE은 insert와 into구문 사이에 ignore을 넣어주기만 하면 됩니다

 

728x90
반응형

댓글