프로그래밍(Web)/업무관련

[바미] ON DUPLICATE KEY UPDATE문을 주의해서 사용하자.

Bami 2023. 2. 3. 11:34
728x90
반응형

코드에서 SQL데이터를 가공하고, SQL INSERT 실행하여 DB에 저장하는부분에서 A~F 까지의 칼럼중에 D,E를 제외한 값들만 들어가지는 문제를 경험하게 되었습니다.

 

문제는 몇 번을 INSERT하더라도 A~F 칼럼만 INSERT가 되지 않더군요.

INSERT INTO a (`a`,`b`,`c`,`d`,`e`,`f`) VALUES ('1INCH_USD','1675296000','0.53045','0.5753','0.52574','0.53045'),          ('AAVE_USD','1675296000','88.793','93.326','87.961','88.7') ON DUPLICATE KEY UPDATE update_time = current_timestamp(3);

이런식의 코드였는데 처음에 했던 부분은 '칼럼 값과 삽입 하려는 데이터의 갯수가 맞는가?' 였습니다. 

당연히 데이터의 갯수는 맞았죠.

 

두 번째로 한 시도는 'UPDATE문을 사용했을 때 null로 들어가 있는 칼럼 값이 바뀌는가?' 였습니다.

이 부분 또한 동일하게 null이 였구요.

 

세 번째로 한 시도는 ' MySQL 프로그램 내에서 값을 직접 삽입 했을 때 변경이 되는가?' 였습니다.

값이 정상적으로 삽입이 되었습니다. 이로 인해 Table locking이 걸렸다거나, 만들지도 않은 보이지 않는 Trigger가 걸린게 아니라는 걸 알게 되었습니다.

 

그 이후 다시 insert문으로 삽입을 시도 했으나 직접 넣은 데이터를 제외하고 들어가지 않는 것이였습니다. 이 부분을 하다가 알게 된 부분 중에 하나는 

PK 키 값이 같은 값이 들어올 때 그 값은 무시되어지도록 하기 위해

ON DUPLICATE KEY UPDATE update_time = current_timestamp(3);

INSERT 마지막에 위와 같은 코드를 사용했습니다.

 

이 부분이 그 당시에는 같은 값이 들어올 때 마지막에 들어온 데이터로 덮어쓰기 하고, update_time으로 한다로 잘 못 생각하고 있었는데 그게 아니라 값은 그대로고 update_time만 변경한다는 의미였던 것이죠. 

 

그렇기 때문에 기존 데이터를 모두 삭제 후 다시 넣어야 했고, 기존에 Insert했던 데이터를 모두 삭제하고, 다시 Insert하여 해결하였습니다.

 

728x90
반응형