WORK/DB

INSERT 후 PK 값 얻어오기

im 수캥이 2018. 2. 12. 16:02



xml에서 insert 후 pk값 가져오는걸 알아보자.


이건 A_TABLE INSERT 후 그 키값을 FK값으로 B_TABLE 에 INSERT 해야 할때 쓰면 유용할 것이다.


먼저 MYSQL 에서 알아보자.


CREATE TABLE USER_INFO (

USER_ID INT NOT NULL

USER_NAME VARCHAR(20) ,

USER_TEL VARCHAR(20)

)


이러한 테이블이 있을때 USER_INFO 테이블 INSERT 후 USER_ID 값을 다른 테이블에 저장하려고 할 경우쓰면된다.



<insert id="InsertUserInfo" parameterType="java.util.HashMap">

 // 이부분 추가

 <selectKey resultType="int" keyProperty="USER_ID " order="AFTER">

SELECT LAST_INSERT_ID()

</selectKey>


INSERT INTO USER_INFO (

  USER_ID   

, USER_NAME  

, USER_TEL 

)VALUES (

  12345

, '홍길동'

, '010-1234-5678'

)


</insert>


보통 INSERT문장에서 


<selectKey resultType="int" keyProperty="USER_ID " order="AFTER">

SELECT LAST_INSERT_ID()

      </selectKey>

이 문구만 추가해 주면 된다.




resultType = 리턴 TYPE

keyProperty = COLUMN 명

order = AFTER  -> INSERT 후 값 가져오기 ( BEFORE 도 있음 )


그리고 이 LAST_INSERT_ID()의 값은 각 connection 마다 따로 관리된다. 

그래서 A와 B가 다른 connection을 가지고 동시에 INSERT 후 LAST_INSERT_ID()값을 SELECT하더라도 자신이 INSERT한 ID값을 반환받게 된다. 예를 들면, A가 INSERT를 하고 LAST_INSERT_ID()를 SELECT하려고 하는 순간 B가 먼저 INSERT를 하였다. 이 경우 A가 SELECT하여 얻어지는 ID값은 B와는 무관하게 A가 INSERT한 ID값이 된다. 물론, 전제 조건은 A와 B가 다른 connection을 사용한다는 것이지만, 동시에 INSERT하고 접근하는 문제가 있어도 유용하게 사용할 수 있다.


BEFORE 의 경우에는 INSERT문장을 실행 전 실행하는 문장이기에 이럴경우에는

SELECT LAST_INSERT_ID()

이 문장을 쓸게 아니라


SELECT MAX(USER_ID)+1 FROM USER_INFO


이렇게 해야겠다.



다음은 MSSQL 에서 알아보자.


MSSQL 은 너무 간단해서 그림으로 데체 하겠다.




<select id="InsertUserInfo" parameterType="java.util.HashMap" resultType="linc.framework.common.DataMap">

SELECT SCOPE_IDENTITY() // 이부분 추가

INSERT INTO USER_INFO (

  USER_ID  

, USER_NAME  

, USER_TEL 

)VALUES (

  12345

, '홍길동'

, '010-1234-5678'

)

</select>



이러한 문장에서 mysql 과 달리 엘리먼트를 insert가 아닌 select로 주어야 한다.

key가 여러개일 경우


SELECT SCOPE_IDENTITY() AS USER_ID 

로 해서 PK값을 가져올 수 있다.


'WORK > DB' 카테고리의 다른 글

테이블 정보 조회하기  (0) 2018.03.13
MYSQL 연락처 자르기  (0) 2018.02.28
mysql function 생성하기  (0) 2018.02.07
MYSQL GROUP_CONCAT (세로컬럼 가로로 합치기 )  (0) 2018.02.01
ORACLE 공백제거  (0) 2018.01.26