블로그 이미지
LanSaid

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

Recent Post

Recent Comment

Recent Trackback

Archive

2015. 12. 7. 18:31 DB/MySQL

일단 MySQL의 Update 문의 특성에 대해서 이해해야할 것이 있다.



Update 쿼리 후에 row_count() 값이 1이면 정상적으로 갱신된 것이다.

하지만 여기까지는 누구나 다 알고 있는 것이고 별로 특징되는 사항도 아니다.



문제는 row_count() 값이 0일 경우이다.

대체적으로 Update 처리할 대상을 못찾은 경우인 경우라고만 생각할때가 많으나... 

한가지 상황이 더 있다.


바로 Update 되기전의 필드 값들과 Update 하려는 값들이 정확히 일치하는 경우(즉, Update 할 내용이 없는 경우)는 Update를 실제로 수행하지 않는 않는다는 것이다.


만약 Update를 하려고했는데 해당필드가 없다면 문제가 있으니 Insert를 하려고 했다면??? 바로 중복키 문제로 쿼리 에러가 발생할것이다.


이를 피하기 위한 방법은 대략적으로 2가지 정도로 보고있는데..


상황은 Update 할때 목표 레코드가 존재하는지 확인해서 있으면 Update, 없으면 Insert 라고 한다면

Stored Procedure 에서 작업한다고 했을때..



1. 해당 목표 레코드가 있는지부터 조회하고 update 나 insert를 결정하자.


DECLARE _tmpRecordCount INT DEFAULT 0;

SELECT COUNT(*) INTO _tmpRecordCount FROM targetTable WHERE 조건절;

IF _tmpRecordCount > 0 THEN

 UPDATE 구문

ELSE

 INSERT 구문

END IF;





2. INSERT INTO ... ON DUPLICATE KEY UPDATE 사용


INSERT INTO atm_game_release.characterinfo (컬럼1, 컬럼2, 컬럼3, ....)

VALUES ( 20, 1, 0, ....)

ON DUPLICATE KEY UPDATE 컬럼1=값1, 컬럼2=값2, 컬럼3=값3, ....;


단, 유니크키(혹은 기본키)는 반드시 있어야 Insert 시 중복여부 검사해서 분기동작될 것이다.

1번과는 반대로 일단 insert를 그냥 시도해보는데 유니크키가 중복판정나면 Update로 처리가 된다.




3. 그외.. 추천하지 않는 방법.


Replace 구문...  이건 DELETE 하고 INSERT하는 처리라.. Auto Increment 를 통해 증가하는 유니크 값(혹은 기본키)가 있다면 꼬이게 되므로 사용하면 안되는 방법이다.


posted by LanSaid