일단 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 를 통해 증가하는 유니크 값(혹은 기본키)가 있다면 꼬이게 되므로 사용하면 안되는 방법이다.
'DB > MySQL' 카테고리의 다른 글
원하는 키워드(ex> 테이블 이름)가 포함된 프로시저 찾기 (0) | 2022.03.02 |
---|---|
[MySQL & MariaDB] DB Backup Batch File (0) | 2016.01.08 |
Error 1172 - Result consisted of more than one row (0) | 2015.11.11 |
mysqldump 시 Use 'DB이름' 쿼리를 포함하지 않으려면? (0) | 2015.02.24 |
[MySQL] mysql 버전에 따라 character_set 변경하기 (1) | 2014.04.07 |