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 |