오라클의 시퀀스 nextval, currval을 MySQL에서 적용하기

15-12-03 by 최고관리자

이번엔, 오라클의 시퀀스의 nextval과 currval

MySQL에선 어떻게 사용할 수 있을지에 대해서 알아보겠습니다.

 

먼저, 오라클에서의 시퀀스의 쓰임부터 알아보겠습니다.

create sequence 시퀀스명;

ex. create sequence test_seq; 

와 같이 시퀀스를 생성하여 

데이터의 순번처럼 사용할 수 있습니다.

 

예를 들어보면 id와 title이라는 컬럼을 가진 testdb3라는 테이블이 있다고 가정해봅니다.

267BBB35546F48B202046D

여기서 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이 됩니다. 

 

244E5A3B546F4A4B13404A

 

 


 

자, 이제 오라클 시퀀스의 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문을 실행해보면

 

26287E4E546F58FF049F2D

이와같이 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);

이렇게 하면

 

222E0949546F5A9C133FDD

마지막행과 같이 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~~~!





Comments

  1. 등록된 코멘트가 없습니다.

Leave a Comment

자동등록방지 숫자를 순서대로 입력하세요.