오라클의 시퀀스 nextval, currval을 MySQL에서 적용하기
이번엔, 오라클의 시퀀스의 nextval과 currval을
MySQL에선 어떻게 사용할 수 있을지에 대해서 알아보겠습니다.
먼저, 오라클에서의 시퀀스의 쓰임부터 알아보겠습니다.
create sequence 시퀀스명;
ex. create sequence test_seq;
와 같이 시퀀스를 생성하여
데이터의 순번처럼 사용할 수 있습니다.
예를 들어보면 id와 title이라는 컬럼을 가진 testdb3라는 테이블이 있다고 가정해봅니다.
여기서 id는 데이터의 순번 컬럼으로 쓰일 것입니다.
nextval과 currval를 한 번에 써볼까요?
insert into testdb3 (id, title) values (test_seq.nextval, test_seq.currval);
위 SQL문장은 id에는 시퀀스의 다음 값을
title에는 시퀀스의 현재 값을 입력하는 문장입니다.
시퀀스는 별도의 지정이 없으면, 0부터 시작하기 때문에
test_seq.nextval의 값은 1이 되며, test_seq.currval 또한 1이 됩니다.
자, 이제 오라클 시퀀스의 nextval과 currval의 기능을 MySQL에서 사용해봅시다.
MySQL에서는 한 컬럼을 key로 지정하여 (오직 한 컬럼만 해당됩니다)
auto_increment라는 옵션 기능을 줄 수 있습니다.
예로 위의 testdb3 테이블을 MySQL에서 생성해보면
create table testdb3 (id int(1) primairy key auto_increment, title varchar(30));
id 컬럼은 key값으로 auto_increment라는 옵션을 주어집니다.
이로써 testdb3를 insert할 경우, id값은 자동적으로 증가하게됩니다.
insert into testdb3 (title) values ('제목 데이터 테스트');
라는 SQL문을 실행해보면
이와같이 id값이 자동으로 +1이 되어 저장되는 것을 확인할 수 있습니다.
이것이 오라클 시퀀스의 nextval과 같은 기능을 하게되는 셈이지요~
그렇다면, currval은 어떻게 사용할 수 있을까요?
검색 결과 프로시저를 이용한 방법이 있었지만
제가 이해하기엔 다소 불필요해보였습니다 T_T
그리하여, 다른 방법을 모색해보았습니다!
currval은 id의 현재 값을 알면 되는거죠?
id는 insert될 때마다 +1씩 되므로
id의 현재 값 = max(id)와 같은 결과를 이루게 됩니다.
그렇다면, 오라클에서의 삽입 SQL문
insert into testdb3 (id, title) values (test_seq.nextval, test_seq.currval);
이와 같은 결과를 이룰려면 어떻게 해야할까요?
▼
insert into testdb3 (title) (select max(id)+1 from testdb3);
이렇게 하면
마지막행과 같이 auto_increment된 id값과 max(id)+1로 구한 title값이
동일한 값으로 삽입된 것을 확인할 수 있습니다.
위의 SQL문은 Java 코드 상에서 변경하면 좀 더 쉽게 insert할 수 있습니다.
예시 코드입니다.
String sql = "select ifnull(max(serial), 0)+1 from board"; // ifnull 함수는 오라클의 nvl함수와 동일합니다. max(serial)이 null값일 경우 0으로 대체.
PreparedStatement pstmt = con.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) currval = rs.getInt(1); // 위 sql문은 serial 컬럼의 최대값에서 +1한 값이 반환될 것이므로 rs.getInt(1)로 값을 받아 currval 이라는 변수에 저장합니다.
sql = "insert into board (mid, pwd, subject, content, grp, deep) values (?, ?, ?, ?, ?, ?)";
pstmt = con.prepareStatement(sql); // 위 sql문장으로 다시 연결
pstmt.setString(1, mid);
pstmt.setString(2, pwd);
pstmt.setString(3, subject);
pstmt.setString(4, content);
pstmt.setInt(5, currval); // serial의 현재 값이 필요한 컬럼에 currval 변수를 이용해 저장합니다.
pstmt.setString(6, Integer.toString(currval));
오라클 시퀀스의 nextval과 currval를 MySQL에서 적용할 다른 방법은
검색을 통해 찾으실 수 있으실 것입니다.
목적에 맞게 좀 더 쉬운 쿼리문을 이용하는 것이 개발할 때
좀 더 편하겠죠?
다음 포스팅에서도 Oracle 문법을 MySQL로 적용하는 법을 알아보겠습니다.
See u later~~~!