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을 넣어주기만 하면 됩니다
'서버 > Mysql' 카테고리의 다른 글
mysql 연결 해제 방지 ping 체크 (2) | 2022.06.01 |
---|---|
Mysql Slow Query log (부하 관리) (3) | 2022.05.11 |
Mysql 패스워드 암호화 및 복호화 (6) | 2022.04.12 |
SQL 두 테이블 비교하여 한쪽 테이블 없는 값 추출 (8) | 2022.02.17 |
SQL 일정 기간 이내 테이블 조회 (10) | 2022.02.16 |
댓글