본문 바로가기
java/spring

2024-02-14

by rewind 2024. 2. 14.

MERGE INTO

조건문에 따라서 INSERT / UPDATE / DELETE를 실행

 

 

기본키 제약사항 위반(PRIMARY KEY)

 

 

 

 

 

 

 

 

 

 

 

 

 

MERGE INTO LPROD A
USING DUAL ON(A.LPROD_ID = '101')
 WHEN MATCHED THEN
      UPDATE
      SET A.LPROD_GU = 'S101',
          A.LPROD_NM = '상품분류명101'
 WHEN NOT MATCHED THEN
      INSERT (LPROD_ID , LPROD_GU , LPROD_NM)
      VALUES(101 , 'S101' , '상품분류명101');

 

LPROD_ID = 101인 행에서

데이터가 존재하면(WHEN MATCHED THEN) UPDATE 실행 ,

데이터가 존재하지 않으면(WHEN NOT MATCHED THEN) INSERT 실행

 

실행시 아래와 같이 확인

 

 

 

 

작업 완료후엔 반드시 COMMIT

 

 

 

 

 

 

 

 

 

 

 

MERGE INTO MEMBER A
USING DUAL ON(A.USER_NO = 1)
WHEN MATCHED THEN
    UPDATE
       SET A.COIN = A.COIN + 500
WHEN NOT MATCHED THEN
    INSERT (USER_NO , USER_ID , USER_PW , USER_NAME , COIN , REG_DATE , UPD_DATE , ENABLED)
    VALUES(6,'a006','$2a$10$vd.Y8PtJfTina10HtRQ6vOS/LXMf8.b4dejXsiXtI/3Wamkm4l1Ou','개똥이' , 0 , SYSDATE , NULL , '1');

 

USER_NO = 1 값 존재시 COIN+500 , 쿼리 실행시 아래와 같이 COIN 증가 확인

 

 

 

 

 

 

로그인 버튼 만들기 ,tiles/aside.jsp => a href ="/login" 으로 수정

 

// lprod/list.jsp 내 <script>가장 하단 부분(360번째줄 부근)
// result.total : 전체 행의 수
/* sessionStorage
    1) 브라우저 세션 기간 동안 만 사용할 수 있으며 탭이나 창을 닫을 때 삭제된다.
    2) 새로고침을 해도 유지된다.
    3) 변경 된 사항은 현재 페이지에서 닫힐 때까지 저장되어 사용할 수 있다.
    4) 탭이 닫히면 저장된 데이터가 삭제 된다.
*/
// session.setAttribute("total" , result.total);
sessionStorage.setItem("total" , result.total);

 

script 내 btnInsert부분 아래와 같이 수정

//아이디 자동 생성
$("#btnInsert").on("click",function(){
    // session.getAttribute("total");
    let total = sessionStorage.getItem("total");
    console.log("total : " + total);

    // lprod테이블의 MAX(LPROD_ID) + 1
    //	contentType:"application/json;charset=utf=8"
    //	data:JSON.stringify(data)
    /*
    요청 URI "/lprod/getMaxLprodId"
    요청파라미터 : 
    요청방식 : post
    */
    $.ajax({
        url:"/lprod/getMaxLprodId",
        type:"post",
        dataType:"text",
        beforeSend:function(xhr){
            xhr.setRequestHeader("${_csrf.headerName}","${_csrf.token}");
         },
        success:function(result){
            console.log("result : " , result);

            lprodId = Number(result) + 1;

            $("#lprodIdNew").val(lprodId);
            $("#lprodIdNew").attr("readonly",true);
        }
    });
    // tbody에 접근해서 자식요소들(<tr>들) 중에서 마지막 자식 요소(last())의 자식 중에서 0번째(<td>38</td>)의 text값
    // let lprodId = $("#lprodTbody").children().first().children("td").eq(0).html();
    // console.log("lprodId : " + lprodId);
    // Number(숫자형문자)->숫자형으로 변환
});

 

 

DB에서 결과확인

 

 

 

 

LprodController에 getMaxLprodId메소드 추가(service,impl , dao , lprod_SQL.xml 수정)

 

수정후 LPROD_ID의 MAX 값으로 result값이 출력되는지 확인

SELECT MAX(LPROD_ID) FROM LPROD

 

위 쿼리문에서의 결과값과 브라우저 콘솔 result값과 동일하면 성공

 

위 내용을 merge into 쿼리문으로 실행해보자 lprod_sql.xml 쿼리문 수정

<insert id="insertOne" parameterType="lprodVO">
		INSERT INTO LPROD(LPROD_ID,LPROD_GU,LPROD_NM)
		VALUES(#{lprodId}, #{lprodGu}, #{lprodNm}) 
</insert>
// 위 insert문을 아래와 같이 수정
<update id="insertOne" parameterType="lprodVO">
		MERGE INTO LPROD A
		USING DUAL ON(A.LPROD_ID = #{lprodId})
		 WHEN MATCHED THEN
		      UPDATE
		      SET A.LPROD_GU = #{lprodGu}
		        , A.LPROD_NM = #{lprodNm}
		WHEN NOT MATCHED THEN
		     INSERT (LPROD_ID, LPROD_GU, LPROD_NM)
		     VALUES(#{lprodId},#{lprodGu},#{lprodNm})
</update>

 

LPROD_ID의 값이 존재시 수정 , 존재하지 않으면 INSERT

(LPROD_ID의 값은 쿼리문으로 LPROD_ID의 MAX값을 가져오고 자바스크립트내에서 해당값에 +1을 해준다)