- 가장 최근에 입력된 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
'DataBase' 카테고리의 다른 글
sql 날짜 비교 where 절 조건 넣을 때 주의할 점 (0) | 2022.04.17 |
---|---|
참조하는 테이블에서 하위 항목이 몇 건인지 출력하는 법 (0) | 2022.04.17 |
sql 특정 문자열을 포함하는지 확인하는 함수 contains (mySQL, Oracle) (0) | 2022.04.12 |
mySQL 에서 insert into 구문 한 번에 여러 줄 추가하기 (0) | 2022.04.02 |
1:N 관계 / M:N 관계, 식별 관계 / 비식별 관계 - 개념과 예시 (0) | 2022.03.27 |