본문 바로가기

DataBase

가장 최근에 insert한 row의 pk 값 받아오기 (테이블을 참조해야 할 때)

- 가장 최근에 입력된 row 불러오기 -

가장 마지막에 입력된 행의 PK값을 받아오려면 어떻게 해야 할까?

꼭 PK값이 아니더라도, 
가장 최근에 insert 된 row에서 
특정 값을 가져와야 하는 떄가 있다.
특히 참조 관계일 때 그렇다.

예를 들어 보자.
'학생' 테이블은 '반' 테이블을 참고하고 있다.
'반' 테이블에 '햇님반'을 하나 추가했다.
'학생' 테이블에는 햇님반에 속하는 학생들을
여러 명 추가해야 한다.

다른 예를 하나 더 보자.
'구매 상세' 테이블은
'구매' 테이블을 참조하고 있다.

구매가 한 건 일어나면,
'구매' 테이블에 row가 하나 생긴다.
그리고 그 구매 안에 있는 상세 품목들마다
'구매 상세' 테이블에 row가 하나씩 들어간다.

이런 경우에,
'햇님반' 하나를 두고 여러 학생들을 추가해야 하며,
구매 건 하나를 두고 여러 상세 항목을 추가해야 한다.

 

 

- max() 함수 활용하기 -

이러면 sql을 어떻게 날려야 할까.
'구매' 테이블에 row를 하나 insert 한다.
그 insert 된 row의 PK값을 받아와야 한다.
그 PK값 하나를 가지고 나머지 '구매 상세' 테이블에 
데이터들을 여러 개 insert해야 하기 때문이다.

그럼 문제는 가장 마지막에 insert한 데이터의 PK값을 어떻게 구할 수 있는지다.

생각을 조금 바꾸면 간단하다.
보통 PK는 (MySQL이라면) 자동 증가를 설정하거나,
(Oracle이라면) 개별 시퀀스를 설정해 둘 것이다.
그 값들은 데이터를 한 줄 insert 할 때마다
+1씩 증가한다.
가장 마지막에 insert 되었다는 것은,
현재 테이블에 존재하는 row들 중에서
가장 높은 값이라는 뜻이다.
즉 가장 높은 값이 가장 최근 값이다.
따라서 가장 마지막에 insert한 값은 아래처럼 구할 수 있다.

SELECT MAX(pur_id) FROM tb_purchase;


pur_id가 primary key 값일 때, 
현재 존재하는 id값들 중에서 
가장 큰 수를 불러온다.
즉, 가장 최근에 입력한 값이다.

따라서 이 값은 '구매' 테이블에서
가장 마지막에 insert한 row의 pk값이고,
이 pk값을 참조해서 '구매 상세' 테이블에
데이터들을 넣으면 된다.

INSERT INTO tb_purchaseinfo (price, cnt, pur_id) VALUES 
(30000, 2, (SELECT MAX(pur_id) FROM tb_purchase)),
(24000, 4, (SELECT MAX(pur_id) FROM tb_purchase)),
(12000, 3, (SELECT MAX(pur_id) FROM tb_purchase));

 

 


- selectKey 활용하기 -

myBatis를 사용한다면, selectKey 태그를 사용해도 된다.
selectKey 태그를 실행하면 그 결과 값을 들고 있는다.

selectKey에는 "order", "keyProperty", "resultType" 등의 속성을 추가할 수 있다.
하나씩 알아보자.

> order
order는 "BEFORE" 또는 "AFTER"를 넣을 수 있다.
BEFORE는 sql문을 실행하기 전에 selectKey 안에 있는 구문을 먼저 실행하고 그 값을 들고 있는다.
AFTER는 sql문을 실행한 뒤에 selectKey 안에 있는 구문을 실행한다.

> keyProperty
이렇게 selectKey 안에서 들고 있는 값은
keyProperty 속성으로 불러올 수 있다.
keyProperty 에 값으로 "idx"를 부여했다면,
불러올 때도 "idx"라고 호출할 수 있다.
parameterType이 객체라면 그 객체의
setter를 불러와서 값을 넣어준다.
그래서 setIdx(); 가 있어야 한다.

>resultType
resultType 속성은 짐작하듯이,
selectKey 안의 구문을 실행한 결과가 어떤 자료형인지 지정하는 속성이다.

<insert id="orderFruit"  parameterType="kr.prac.fruit.model.ShoppingItem">
<selectKey keyProperty="pur_id" order="BEFORE" resultType="int"> 
SELECT max(pur_id) from tb_purchase 
</selectKey>
INSERT INTO
    tb_purchaseinfo (cnt, pur_id, loginID, fruit_id)
VALUES
    (#{cnt}, #{pur_id}, #{loginID}, #{fruit_id})
</insert>



 

- 220405 

반응형