자신감뿅뿅
226
2021-04-20 17:13:21 작성 2021-04-20 17:14:01 수정됨
5
94

mybatis selectKey Max 사용시 오류가납니다. 도와주세요...


<insert id="insert" parameterType="galleryVO">

<selectKey keyProperty="g_no" resultType="int" order="BEFORE">

    SELECT IFNULL(MAX(G_NO), 0) + 1  

    FROM GALLERY

    </selectKey>

INSERT INTO GALLERY(G_NAME, G_PW, G_TITLE, G_CONTENT, G_SDATE, G_SUB, G_TAG)

VALUES(#{g_name}, #{g_pw}, #{g_title}, #{g_content}, now(), #{g_sub}, #{g_tag})

</insert>


위와같이 게시글 등록하는 쿼리가있고 


그후에 위에 selectKey 받아서 아래처럼 첨부파일 등록하는 쿼리가있습니다.


<!-- 게시글 파일첨부 업로드 -->

<insert id="insertFile" parameterType="hashMap">

INSERT INTO GA_FILE(G_NO, ORG_FILE_NAME, STORED_FILE_NAME, REGDATE, FILE_SIZE)

VALUES(#{G_NO}, #{ORG_FILE_NAME}, #{STORED_FILE_NAME}, now(),#{FILE_SIZE})

</insert>


문제는 selectKey에서 MAX값받아오는게 문젠대 따로 mysql 에서 돌려보거나하면 

마지막 g_no값이 6이면 그다음값인 7이 받아져오는데 

실제 실행시에  중간에 글을 삭제한적이있으면 

7이아닌 삭제된 게시글 번호값부터 +1 해서 저장이되는데 해결방법이없을까요..

0
  • 답변 5

  • 프네
    48
    2021-04-20 17:37:29

    혹시 G_NO 컬럼이 VARCHAR 타입인가요? VARCHAR 타입일 경우에 MAX함수를 사용하면 숫자가 아닌 문자로 MAX를 구해서 1,2,3,4, ... 순서가 아닌 1, 10, 11, ... , 2, 20, 21, ... 순서로 갈거에여 만약 VARCHAR타입이 맞다면 MAX 함수 사용할 때 형변환 하시고 MAX 함수 사용해보세욥

  • htofu
    248
    2021-04-20 17:48:29

    <insert id="insert" parameterType="galleryVO">

    INSERT INTO GALLERY(G_NAME, G_PW, G_TITLE, G_CONTENT, G_SDATE, G_SUB, G_TAG)

    VALUES(#{g_name}, #{g_pw}, #{g_title}, #{g_content}, now(), #{g_sub}, #{g_tag})


                  <selectKey keyProperty="g_no" resultType="int" order="BEFORE">

         SELECT IFNULL(MAX(G_NO), 0) + 1  

         FROM GALLERY

        </selectKey>


    </insert>


    위치 한번 변경해보세요.


  • nutpick
    298
    2021-04-20 18:04:17

    auto increment 옵션 켜시고

    키를 insert하지마세요

  • 오후
    2k
    2021-04-20 18:06:40

    게시글 등록후 해당 PK (g_no) 가지고 하위테이블에 파일을 등록하는 로직으로보입니다.


    select key 는 돌리지만 GALLERY insert 구문상 g_no 는 사용을안하시네요?.

    그럼 autoincrement 걸려있는거같은데

    SELECT LAST_INSERT_ID() 로 받아올수있습니다.


    <insert id="insert" parameterType="galleryVO">
    
    		INSERT INTO GALLERY(G_NAME, G_PW, G_TITLE, G_CONTENT, G_SDATE, G_SUB, G_TAG)
    
    		VALUES(#{g_name}, #{g_pw}, #{g_title}, #{g_content}, now(), #{g_sub}, #{g_tag})
    
    
                  <selectKey keyProperty="g_no" resultType="int" order="AFTER">
    
    	        SELECT LAST_INSERT_ID()
    
    	    </selectKey>
    
    
    
    	</insert>


  • 자신감뿅뿅
    226
    2021-04-23 00:04:40

    다들 답변주셔서감사합니다.  오후님이 주신 방법으로 해결했습니다.

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