반응형
오라클만 사용하다보니 mysql을 사용할 일이 거의 없어서 몰랐는데
mysql에는 seq.nextval이 없었더라...
그래서 찾아보니 함수로 만들수 있었다.
단계는 4단계였다.
- 시퀀스용 테이블 생성
- 시퀀스 생성 프로시저 생성
- 생성한 시퀀스의 다음 값 가져오는 함수 생성
- 시퀀스를 생성 할 프로시저 실행
이렇게 하면 이제 nextval 이라는 이름의 함수를 사용할 수 있게된다.
만들어보자
- 시퀀스용 테이블 생성
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자리 수를 생성해봤다.