LlllJWw
241
2022-08-06 16:12:36
10
181

MySQL ON DUPLICATE KEY UPDATE



	<insert id="registCrr">
			<selectKey keyProperty="resNo" resultType="int" order="BEFORE">
				SELECT LAST_INSERT_ID()
			</selectKey>
		INSERT INTO
		rescrr(crr_no,crr_com,crr_dept,crr_pos,crr_addt,crr_grdt,res_no)
		VALUES
		<foreach collection="crrList" item="list" separator=" , ">
		(default,#{list.crrCom},#{list.crrDept},#{list.crrPos},#{list.crrAddt},#{list.crrGrdt},#{resNo})
		</foreach>
위의 인서트 문은 정상 작동 됩니다!

	<insert id="updateCrr">

	INSERT INTO			
	rescrr(crr_no,crr_com,crr_dept,crr_pos,crr_addt,crr_grdt,res_no)
	VALUES
  	<foreach collection="crrList" item="list" separator=" , ">
    (default,#{list.crrCom},#{list.crrDept},#{list.crrPos},#{list.crrAddt},#{list.crrGrdt},#{resNo})
  	</foreach>
  ON DUPLICATE KEY UPDATE 
  			crr_com = values(crrCom),crr_dept = values(crrDept),
  			crr_pos = values(crrPos),crr_addt = values(crrAddt),
  			crr_grdt = values(crrGrdt) ,res_no = values(resNo)
  			
</insert> 
ON DUPLICATE KEY UPDATE 를 이용하려고 했는데, 오류가 나네요.. 어딜 수정해야할까요?
 Error updating database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column 'crrCom' in 'field list'
0
  • 답변 10

  • LlllJWw
    241
    2022-08-06 16:13:51

    resNo는 화면에서  값이 넘어옵니다!


  • LlllJWw
    241
    2022-08-06 16:15:20


      			crr_com = values(#{crrCom}),crr_dept = values(#{crrDept}),
      			crr_pos = values(#{crrPos}),crr_addt = values(#{crrAddt}),
      			crr_grdt = values(#{crrGrdt}) ,res_no = values(#{resNo})
    
    이렇게 재 시도 중..


  • Mambo
    8k
    2022-08-06 16:23:10
    The ON DUPLICATE KEY UPDATE clause can contain multiple column assignments, separated by commas. In assignment value expressions in the ON DUPLICATE KEY UPDATE clause, you can use the VALUES(col_name) function to refer to column values from the INSERT portion of the INSERT ... ON DUPLICATE KEY UPDATE statement.

    일반적으로 crr_com과 crrCom은 다른 컬럼입니다.

  • LlllJWw
    241
    2022-08-06 16:29:32

     

    Mambo

    단순한 인서트 구문에서는,
    스프링 설정에서 <setting name="mapUnderscoreToCamelCase" value="true"/> 를 줘서 변환해주었는데,

    DUPLICATE KEY UPDATE  에서는 안된다는 건가요..?

  • duplicate뒤의

    VALUES 부분에서는 받는 변수가 아닌 컬럼명. 으로 해주셔야합니다

  • LlllJWw
    241
    2022-08-06 18:08:29
  • LlllJWw
    241
    2022-08-06 18:16:47

    히에히에( ̄▽ ̄)ノ

    그런데, 다른... 문제가.. 생겼습니다..

    구글링 결과 INSERT 시도 후에, UPDATE를 하는 것이라

    중복되는 PK가 auto increment 라면,, 1이 증가한다고,,,

    성공은 했는데 다른 방법을 찾아야게네요 ㅜㅜㅜ

  • LlllJWw
    241
    2022-08-06 18:22:52
  • 히에히에( ̄▽ ̄)ノ
    25
    2022-08-06 20:51:34

    그러실필요없어요

    crr_no 이 컬럼이 auto increament 컬럼인거같은데

    list 돌면서 일단 비교해서 값이이미 존재하는값이면 update고

    없는값이면 insert잖아요


    해당 쿼리에서 저 default 부분을 

    #{list.crr_no}으로 받도록 수정하고


    list데이터넘겨주실때 key가있는값은 setCrrNO하고

    key가없는값이면 set안하도록 구현할수도있어요.


    이떄 신규로 insert되는값은 key가 null로들어가게되서

    자동으로 autoIncrement 된값으로 디비에 박히게 되요

    또한 key가 들어왔다면 update로직으로 빠지겠죠

  • LlllJWw
    241
    2022-08-10 11:08:59

    히에히에( ̄▽ ̄)ノ  흠 ㅜㅜ 너무 상세한 답변 감사합니다..

    List 데이터 넘겨줄때가, DB 접근하기 이전에, 어떻게 검증을 해야할지..

    컨트롤러에서 매개변수로 설정한 DTO 변수명이 넘어오는 값과 같다면
    화면에서 넘오는 값이 자동으로 set이 되지 않나요..?

    이때 넘어오는 값을 어떻게 구현하는지 잘 모르겠습니다 ㅠㅠ 
    (구글링 열심히 해 본 결과..)



  • 로그인을 하시면 답변을 등록할 수 있습니다.