가끔 테이블에 row가 있으면 update를 하고, 없으면 insert 를..
뭐.. 나같은 경우는 종종 있더라.. 지금까지는 아무 생각없이..
select를 하고, 데이터가 없으면 insert, 있으면 update 이런 식으로 개발을 했다.
문뜩.. 궁금하더라.. 과연 이렇게 무식한 방법말고 좋은 방법은 없을까?? 뭐 이런 생각도 있기는 했지만.. 우선 이 방법이 thread safety 하지 않더라.. 여러넘이 동시에 select를 해서 없다고 판단하고.. 여러넘이 동시에 insert를 하니 당근 문제가 발생한다. 자.. 그래서 찾은 넘이 merge 라는 넘이다. 이넘 조건으로 있냐 없냐를 판단해서 insert 나 update를 수행한다. 결론은 이놈도 thread safety 하지 않다. ㅋㅋ
뭐.. 그래도 이넘 유용하게 사용할 수 있어 즐거운 시간이였다. ^^
merge into LOG_TABLE
using dual
ON(
-- 여기서 LOG_TABLE에 row가 있냐 없냐를 찾는다.
reg_dts = #regDts#
and name = #name#
and img_size = #imgSize#
and position = #position#
and type = #type#
)
WHEN MATCHED THEN
-- 있으면 Update 를 수행하고..
update set
click_count = ( select (click_count + 1) as click_count
from LOG_TABLE
where reg_dts = #regDts#
and name = #name#
and img_size = #imgSize#
and position = #position# )
WHEN NOT MATCHED THEN
-- 없으면 Insert 를 수행한다.
insert(reg_dts, name, img_size, position, click_count, view_count, mod_dts, type)
values (#regDts#, #name#, #imgSize#, #position#, #clickCount#, #viewCount#, sysdate, #type# )
위 샘플을 보면 .. 단순히 로그를 저장하는 넘이다.. 뭐.. 가끔 뷰 카운트를 증가시켜야 할때가 있기는 하지만서두..
조건에 해당하는 넘을 찾고.. 있으면 Update, 없으면 Insert ...