본문 바로가기

개발이야기

MYSQL 내 DB insert 시 기존 값 유무 검사 후 insert 하기

북스캔에서는 책을 검색하거나 바코드로 검색을 하면 히스토리를 저장하게끔 하였는데요. 회원가입도 없고 개인정보도 없습니다. 


그냥 고유 번호를 주고 거기에 저장을 하는데요. 히스토리 기능 중에 바코드를 여러번 찍거나 혹은 페이지를 이동하게 되면 히스토리가 여러개가 보이는 일종의 버그 버그라기 보다는 개선사항이 있었습니다. 

제가 원하는 방향은 동일한 책을 여러번 찍어도 한번만 보이고, 페이지를 이동해도 동일한 책은 한번만 보이는 것이지요. 


물론 다른 책을 찍고 나서 그 전 책을 검색하면 나와야겠지요. 

그러면 DB에 Insert를 해야 하는데요. 무조건 insert를 하는게 아니라 

기존 마지막 레코드에 동일한 키워드 값이 있으면 넣지 말고, 동일한 키워드가 없다면 insert

그래서 찾아보니 몇가지 방법이 있는데, mysql에 not exists 방식이 가장 많이 눈에 띄웠는데요. 

그렇게 사용해서 만드는 방법을 해보니 


INSERT INTO table (field)  

SELECT 'value' FROM DUAL  

WHERE NOT EXISTS (SELECT * FROM table WHERE field='value')  


이런식의 개념이였습니다. DUAL은 가상의 테이블이고, 

그런데 제가 원하는 것이랑 조금 다른 부분은 이런 조건은 

예를 들면 테이블 내에 기존에 값이 없으면 insert하라 인데, 


제가 원하는 조건은 한가지 더 시간차로 인해서 마지막 값이 동일 값이 아니면 insert하라 입니다. 


그래서 


INSERT INTO TABLE명 (컬럼1, 컬럼2, KEYWORD, TIME, DATE)

select 'value1', 'value2' , 'keyvalue', now(), DATE_FORMAT(now(), '%Y.%m.%d') from dual 

where (select KEYWORD from TABLE명 where 컬럼1='value1' ORDER by TIME desc limit 1) <> 'keyvalue' 

;

이런식으로 하였습니다. 

이때 처음에 오류가 났던 것은 select 문장에서 괄호가 있었던 것 제거 해서 해결이 되었고, 

기존 insert문에서는 insert into table명 (컬럼들) values (값들)인데, values를 사용하지 않고, select와 from dual을 이용한점 


그리고 중요한 것이 IFNULL인데요. 이렇게 값을 다시 한번 치환을 해줘야 비교가 제대로 된다는 점도 유의 해야 합니다. 

WHERE IFNULL((SELECT HIST_KEYWORD from HIST_LST_TBL where DEVICE_ID=? ORDER BY HIST_TIME desc limit 1),'') <> ?


마지막으로 WHERE NOT EXISTs를 사용하지는 않고, 필요 조건으로 바꾼 점입니다. 

이렇게 해서 히스토리 상에 동일 내용은 한번만 보이도록 바꾸었네요. 



다운로드 링크

https://play.google.com/store/apps/details?id=com.hitouch.bookscan