by 찡스쿄 [MySQL] MySQL ON DUPLICATE KEY UPDATE [2020.11.05 10:30:33]
안녕하세요, 선배님들 계정 정보를 생성하는 다음의 SQL 문이 있습니다. 헌데, 비밀번호의 경우에는 파라미터로 전달받은 경우에만 UPDATE를 해주고 싶은데, 앞의 INSERT 문이 실행되면서 'CHARGE_PW CAN NOT BE NULL' 오류가 발생하고 있습니다. ON DUPLICAET KEY UPDATE를 이용할 때 다음의 쿼리와 같이 동적으로 처리할 수 있는 방법이 없을까요?.. 답변 미리 감사드립니다. INSERT INTO TB_CHARGE_MG ( CHARGE_SQ , ASSIGN_SQ , CHARGE_NM , CHARGE_ID , CHARGE_PWD , USE_YN , CHARGE_AUTH , REGISTER_DT , MODIFY_DT ) VALUES ( #{chargeSq} , #{assignSq} , #{chargeNm} , #{chargeId} , #{chargePwd} , #{useYn} , #{chargeAuth} , NOW() , NULL ) ON DUPLICATE KEY UPDATE MODIFY_DT = NOW() , CHARGE_NM = #{chargeNm} , CHARGE_ID = #{chargeId} , USE_YN = #{useYn} , CHARGE_AUTH = #{chargeAuth} === if 조건이 들어갑니다 === , CHARGE_PWD = #{chargePwd}
=====================
마농 선생님 답변 감사드립니다. ^^ 말씀하신 대로 변경해 보았지만 다음과 같이 쿼리가 실행되고, 오류가 발생하고 있습니다. 비밀번호의 경우는 변경할 수도, 변경하지 않을 수도 있기에 NULL이 들어올 수 있다는 가정하에 작성한 쿼리입니다. INSERT INTO TB_CHARGE_MG ( CHARGE_SQ , ASSIGN_SQ , CHARGE_NM , CHARGE_ID , CHARGE_PWD , USE_YN , CHARGE_AUTH , REGISTER_DT , MODIFY_DT ) VALUES ( 1 , 1 , '관리자' , 'admin' , NULL , 'Y' , 'A' , NOW() , NULL ) ON DUPLICATE KEY UPDATE MODIFY_DT = NOW() , CHARGE_NM = '관리자' , CHARGE_ID = 'admin' , USE_YN = 'Y' , CHARGE_AUTH = 'A' , CHARGE_PWD = IFNULL(NULL, CHARGE_PWD) Exception : Column 'CHARGE_PWD' cannot be null
잘못 이해하신 듯 합니다.
ON DUPLICATE KEY UPDATE를 이용하지 말라는게 아닙니다.
또한 요청하신 오류부분을 해결해 드린 것이구요.
다만 테스트 데이터가 잘못 된 듯 합니다.
업데이트가 아닌 인서트를 타는 데이터로 NULL 입력 테스트 하신 듯 합니다.
인서트가 아닌 업데이트를 타는 데이터로 NULL 입력 테스트를 해보세요.
인서트를 타는 데이터라면? 당연히 널이 들어오면 안되구요.
혹시? 테스트 데이터에 문제가 없는데도 해당오류가 난다면?
dup 오류보다 null 오류가 우선인가 보네요.
INSERT 구문 쪽에도 강제로 IFNULL 처리를 해주세요.
- 변경전 : , #{chargePwd}
- 변경후 : , IFNULL(#{chargePwd}, 'x')