SELECT 한 결과를 INSERT/UPDATE 하기
별도의 sql id 로 select, insert 쿼리를 각각 분리하여 선언하고
select 한 값을 서버에서 다시 insert sql 의 매개변수로 던져주어 DB에 insert 할 경우
WAS서버와 DB 서버간 DB connection 이 두 번 발생 하므로,
다음과 같은 방법을 이용하자.
1. mysql 의 select insert 문법 사용
ex1)
1
2
|
INSERT INTO sampleTable (col1, col2, col3)
SELECT #{val1}, #{val2}, #{val3}
|
cs |
ex2)
1
2
|
INSERT INTO sampleTable(col1, col2, col3)
SELECT #{val1}, #{val2}, MAX(col3) FROM sampleTable WHERE pkKey = #{pkKey}
|
cs |
2. mybatis 의 selectKey 사용
1
2
3
4
5
6
7
8
9
|
<insert id="sampleSelectInsert" parameterType="java.util.HashMap">
<selectKey keyProperty="selectRs" resultType="integer" order="before">
SELECT MAX(val)
FROM sampleTable
WHERE key = #{value}
</selectKey>
INSERT INTO targetTable (col1, col2, col3)
SELECT #{val1}, #{val2}, #{selectRs}
</insert>
|
cs |
* order 옵션을 before 로 사용시 메인 쿼리 (위 예제에서 insert sql) 실행 전에 selectKey sql 실행.
위의 경우 insert sql 실행 전에 select sql가 실행되어야 selectRs 라는 값을 가져올 수 있으므로 order 를 before로 지정
* order 옵션을 after 로 사용시 메인 쿼리 실행 후에 selectKey sql 이 실행되므로, insert 이후의 seq(시퀀스) max 값을
return해야 할 때 유용하게 사용 가능
※ update 에서 selectkey 를 사용할 경우 mybatis 버전이 낮을 때 에러가 발생하는 경우가 있는 것 같다.
select + update 를 사용해야 하는 경우 서브쿼리를 사용하자.
반응형
'DB > MYSQL' 카테고리의 다른 글
Mysql hierarchy sql 계층구조 쿼리 : 설계 및 쿼리작성(Multi selectbox) (0) | 2019.08.21 |
---|---|
[Mysql] 시간 계산 : DATE_ADD, DATE_SUB (0) | 2019.08.21 |
[Mysql/ORACLE] 여러 행을 한 줄로 표현하기(GROUP_CONCAT) (0) | 2019.05.27 |
mysql GROUP BY (only full group by) (3) | 2019.03.11 |
데이터 형식 바꾸기 : DATE_FORMAT(mysql), TO_DATE(Oracle), CONVERT(sybase) (0) | 2018.12.10 |