본문 바로가기

DB/MySql

mysql 시퀀스

반응형

오라클만 사용하다보니 mysql을 사용할 일이 거의 없어서 몰랐는데

mysql에는 seq.nextval이 없었더라...

그래서 찾아보니 함수로 만들수 있었다.

단계는 4단계였다.

  1. 시퀀스용 테이블 생성
  2. 시퀀스 생성 프로시저 생성
  3. 생성한 시퀀스의 다음 값 가져오는 함수 생성
  4. 시퀀스를 생성 할 프로시저 실행

이렇게 하면 이제 nextval 이라는 이름의 함수를 사용할 수 있게된다.

만들어보자

 

  1. 시퀀스용 테이블 생성
create table T_SEQ
(
	NAME varchar(32), CURRVAL BIGINT UNSIGNED
)
ENGINE = InnoDB
comment '시퀀스용테이블';

저기서 NAME을 기준으로 시퀀스가 배정된다.

2. 시퀀스 생성 프로시저 생성

DELIMITER $$
CREATE PROCEDURE `create_sequence` (IN the_name text)
MODIFIES SQL DATA
DETERMINISTIC
BEGIN
    DELETE FROM T_SEQ WHERE name=the_name;
    INSERT INTO T_SEQ VALUES(the_name,0);
end $$

해석해보자 create_sequence 라는 프로시저를 만들고 the_name의 파라미터를 가지고 있다.

T_SEQ 테이블 name에 the_name과 같은 이름이 있다면 삭제하고

the_name 으로 들어온 값 필드에 0을 배정하며 생성한다.

3. 생성한 시퀀스의 다음값을 가져오는 프로시저 생성

DELIMITER $$
CREATE FUNCTION `nextval` (the_name VARCHAR(32))
RETURNS BIGINT UNSIGNED
MODIFIES SQL DATA
DETERMINISTIC
BEGIN
    DECLARE ret BIGINT UNSIGNED;
    UPDATE T_SEQ SET currval = currval+1 WHERE name = the_name;
    SELECT currval INTO ret FROM T_SEQ WHERE name = the_name LIMIT 1;
    RETURN ret;
end $$

nextval 이라는 함수를 만드는 프로시저다.

파라미터는 the_name으로 받으며 ret 이라는 변수를 생성하게된다

T_SEQ 테이블에 지정된 name필드의 currval 의 값을 1증가하여 update해주고

그 값을 select하여 ret에 할당한 뒤 반환해주는 함수를 만든다.

4. 시퀀스를 생성 할 프로시저 실행

CALL create_sequence('TEST');
 

프로시저는 전부 만들었으니 create_sequence 프로시저를 실행하여

TEST 시퀀스를 생성하였다.

TEST 시퀀스에는 0이 할당되었다.

사용방법은

select nextval('TEST') FROM DUAL;

 

함수형식으로 사용하면 된다.

오라클의 seq.nextval() 과는 다르다는 점 참고하자

예시)

select CONCAT('1','S', LPAD(nextval('TEST'), 8, '0')) from dual

맨앞에 1과 S를 뒤에는 시퀀스값을 포함하여 0으로 채워 10자리 수를 생성해봤다.