sitelink1 | https://blog.leocat.kr/notes/2017/07/22/...ter-insert |
---|---|
sitelink2 | https://www.omnibuscode.com/board/index...._srl=57625 |
extra_vars5 | |
extra_vars6 |
함수의 이해는 sitelink1 를 참고하면 된다.
연관하여 다음 seq 를 조회하고자 할땐 sitelink2 문서를 참고하면 된다.
프로그램에서 SELECT LAST_INSERT_ID() 함수 쿼리를 이용할시 유의할 점은 동일한 connection 으로만 사용해야 한다는 것이다.
가령 insert 를 위해 transaction connection 을 open 하여 insert 수행후에
동일한 connection 에 대해 SELECT LAST_INSERT_ID() 를 실행하면 방금 삽입한 row 의 index 값을 취할 수 있게 되는 것이다.
하지만 해당 connection 을 close 하고 새로운 connection 을 open 하여 SELECT LAST_INSERT_ID() 함수를 실행하게 되면 무조건 0 을 반환하게 된다.
java의 예시는 다음과 같다.
public int add(String serialNum, String dateTime, String seqMall, String seqUser) throws Exception {
int seqOrder = -1;
StringBuffer querySb = new StringBuffer();
querySb.append("INSERT INTO jbg_order (");
querySb.append("serial_num,");
querySb.append("date_time,");
querySb.append("seq_jbgmall,");
querySb.append("seq_user");
querySb.append(") values (");
querySb.append("'"+serialNum + "'");
querySb.append(", "+ dateTime);
querySb.append(", "+ seqMall);
querySb.append(", "+ seqUser);
querySb.append(")");
log.debug("LOCALDB-QUERY------------------------------------------------------------------------------");
log.debug(querySb);
LocalDBConnection conn = null;
try {
conn = new LocalDBConnection();
conn.txOpen();
conn.txExecuteUpdate(querySb.toString());
String getLastIdQuery = "SELECT LAST_INSERT_ID() id";
ResultSet rset = conn.executeQuery(getLastIdQuery);
if (rset != null) {
if (rset.next()) {
seqOrder = rset.getInt("id");
}
}
conn.txCommit();
} catch (SQLException sqle) {
log.error("* 아이고!! ㅜ.ㅜ 데이터베이스 업데이트 에러 발생");
log.error(sqle.getMessage());
log.debug(ExceptionUtil.getStackTraceString(sqle.getStackTrace()));
sqle.printStackTrace();
throw sqle;
} catch (Exception e) {
log.error("* 데이터베이스 업데이트 에러 발생");
log.error(e.getMessage());
log.debug(ExceptionUtil.getStackTraceString(e.getStackTrace()));
e.printStackTrace();
conn.txRollBack();
throw e;
} finally {
conn.close();
}
return seqOrder;
}