[SQL] 데이터가 없으면 INSERT, 있으면 UPDATE (같은 데이터 중복 삽입 해결)
프로젝트를 하다보면
데이터를 삭제를 할 경우,
delete문을 쓰는 게 아닌 삭제여부 = 'Y'와 함께 update를 할 때가 있다.
어떤 데이터를 insert 하고 다시 지우고 싶을 때
update를 하기 때문에 해당 데이터가 사라지는 게 아니라 삭제여부가 'Y'인 채로 남아있는데
이런 경우에 같은 데이터를 다시 insert 하면 삭제여부만 'N'인 똑같은 내용의 새로운 행이 추가된다.
만약 그 데이터를 또 삭제하려고 update하고 또 insert하고 계속 반복하다보면
삭제여부 = 'Y'의 똑같은 행이 무한 생성된다^^!
예를 들어
'TABLE01'이라는 테이블에 MBR_SN, MENU_SN, DEL_YN 데이터를 INSERT하고 싶다고 가정해보자.
그렇다면 코드를 이렇게 쓸 것이다.
INSERT INTO TABLE01(MBR_SN, MENU_SN, DEL_YN) VALUES(1, 1, 'N')
그리고 그 데이터를 지운다고 가정하면
이렇게 쓸 것이다.
UPDATE TABLE01
SET DEL_YN = 'Y'
WHERE MBR_SN = 1
AND MENU_SN = 1
AND DEL_YN = 'N';
하지만 여기서 다시 INSERT를 하면
MBR_SN = 1, MENU_SN = 1, DEL_YN = 'N' 인 데이터가 새로운 행으로 추가된다.
그리고 UPDATE하면 첫번째 데이터와 똑같은 데이터가 생성되고
데이터 삽입과 삭제(라고 부르지만 삭제여부 업데이트)가 반복될 때마다
똑같은 데이터(행)가 무한 생성되는 문제가 생긴다는 것!
이런 무한 중복 생성을 쉽게 해결해주는 쿼리문이 있다!
'데이터가 없으면 INSERT, 있으면 UPDATE' 해주는!
ON DUPLICATE KEY UPDATE ~.. 이다.
INSERT INTO TABLE01(MBR_SN, MENU_SN, DEL_YN) VALUES (1, 1, 'N')
ON DUPLICATE KEY UPDATE DEL_YN = 'N';
이렇게 ON DUPLICATE KEY UPDATE DEL_YN = 'N' 한 줄만 추가해두면
데이터 삭제 후에(삭제여부를 'Y'로 만드는 UPDATE 후에)
다시 같은 데이터를 INSERT할 때 새로운 행이 추가되는 게 아니라,
(MBR_SN = 1, MENU_SN = 1)인 데이터는 UPDATE문이 실행되어 해당 데이터가 수정이 된다!
여기서 중요한 건
중복 저장을 막기 위해 MBR_SN과 MENU_SN이 UNIQUE키로 등록되어 있어야 한다.