본문 바로가기

개발/DB

[MySQL] mysql 에서 sequence 기능 nextval 사용하기.

반응형

- 나의 상황

: 현재 진행하는 프로젝트에서 특정 테이블들의 키 컬럼은 auto_increment 를 설정할 수 없어 sequence 기능을 사용하기 위해 찾아보게 되었다.   

우선 mysql 은 oracle 과 다르게 시퀀스 기능을 별도로 제공하지 않아서.. 이것저것 직접 설정해줘야 했다. 

- 설정 

1. 시퀀스를 사용할 테이블 생성

CREATE TABLE sequences (NAME VARCHAR(32), CURRVAL BIGINT UNSIGNED) ENGINE = InnoDB

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

DELIMITER $$
	CREATE PROCEDURE `create_sequence` (IN the_name text)
    MODIFIESSQL DATA
    DETERMINISTIC
    BEGIN
    	DELETE FROM sequences WHERE name = the_name;
        INSERT INTO sequences VALUES(the_name, 0);
    END
// 받은 시퀀스명으로 시퀀스가 이미 생성되어 있다면, 지우고 새로 생성

3. 생성 한 시퀀스의 다음 값을 가져오는 함수 'nextval' 생성

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

 

여기까지 하고 나면 위와 같이 sequences 테이블과 Procedurse 에 create_sequence, nextval 이 생성된 것을 확인할 수 있다. 

 

- 사용

1. 시퀀스 컬럼 생성

call create_sequence('TEST_SEQ');

* 만약 이미 TEST_SEQ 가 존재하는데 생성요청을 하면, currval가 0으로 초기화되므로 주의하자!

2. nextval 호출 (호출하는 순간 +1 됨!)

select nextval('TEST_SEQ') from dual;

3. 활용

INSERT INTO TEST_TABLE
	(TEST_SEQ, COL_1, COL_2)
VALUES
	( select nextval('TEST_SEQ') as TEST_SEQ from dual, 'col1Val', 'col2Val')

 

 

 

완전 참고한 출처!

https://proudin.tistory.com/entry/MySql%EC%97%90%EC%84%9C-Sequence-%EA%B8%B0%EB%8A%A5%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95

반응형