[MySQL] 오라클에서 사용하던 시퀀스(Sequence) 구현하기 (feat. 날마다 시퀀스 초기화하기)
나는 주로 오라클 데이터베이스를 사용하는데,
사이드 프로젝트를 시작하면서 MySQL을 사용하고 있다.
그러다 시퀀스 기능이 필요하여 찾아보니
MySQL에서는 오라클의 시퀀스 기능이 없다는 것을 알게 되었다.
시퀀스 (Sequence)
시퀀스(Sequence)란 순서를 의미하며, 자동으로 연속적인 숫자를 생성하는 객체
그럼 MySQL에서는 시퀀스(Sequence)와 같은 기능은 사용할 수 없을까?
MySQL에서도 프로시저(Procedure)와 함수(Function)를 사용하여
충분히 오라클의 시퀀스 기능과 비슷하게 구현이 가능하다는 것을 알게 되었다.
더 나아가 날마다 시퀀스를 초기화하는 방법까지
응용해서 원하는 방향의 시퀀스를 생성하면 될 것 같다.😉
환경정보
MySQL 8.0.28
1. 시퀀스(Sequence) 테이블 생성
시퀀스명(name)과 해당 값(currval)으로 테이블을 생성한다.
create table sequences
(
name varchar(32),
currval bigint unsigned
) engine = InnoDB;
2. 프로시저(Procedure) 생성
create_sequence 프로시저를 생성한다.
시퀀스명을 인자로 받아 sequences 테이블에 데이터를 넣어주는 프로시저다.
create procedure `create_sequence` (In seq_name text)
modifies sql data
deterministic
begin
delete from sequences where name = seq_name;
insert into sequences values(seq_name, 0);
end;
3. 함수(Function) 생성
오라클 시퀀스의 기능 중 다음 시퀀스 값을 가져오는 nextval 함수도 만들어 준다.
create function `nextval` (seq_name varchar(32))
returns bigint unsigned
modifies sql data
deterministic
begin
declare ret bigint unsigned;
update sequences set currval = currval + 1 where name = seq_name;
select currval into ret from sequences where name = seq_name limit 1;
return ret;
end;
4. 시퀀스 프로시저 실행
call create_sequence('seq_member');
5. nextval 함수 사용
nextval 함수를 호출할 때마다 값이 1씩 상승하는 것을 알 수 있다.
select nextval('seq_member') from dual;
위 내용을 응용하여 날마다 초기화하는 시퀀스를 만들어보려고 한다.
6. 날마다 초기화되는 시퀀스(Sequence)
6-1. 시퀀스 테이블 생성
시퀀스 테이블에 currdate라는 날짜를 표현하는 컬럼을 추가한다.
create table sequences
(
name varchar(32),
currval bigint unsigned,
currdate date
) engine = InnoDB;
6-2. 프로시저 생성
시퀀스 테이블에 데이터를 넣을 때 현재날짜도 함께 넣어준다.
create procedure `create_sequence` (In seq_name text)
modifies sql data
deterministic
begin
delete from sequences where name = seq_name;
insert into sequences values(seq_name, 0, CURRENT_TIMESTAMP);
end;
6-3. 함수 생성
시퀀스 테이블의 currdate와 현재 오늘 날짜를 비교하여
오늘보다 이전일 경우 currval은 1, currdate는 오늘날짜로 초기화하는 로직을 추가했다.
create function `nextval` (seq_name varchar(32))
returns bigint unsigned
modifies sql data
deterministic
begin
declare ret bigint unsigned;
declare newday int;
select DATEDIFF(currdate, CURRENT_DATE()) into newday from sequences where name = seq_name limit 1;
if newday < 0 then
update sequences set currval = 1, currdate = now() where name = seq_name;
else
update sequences set currval = currval + 1 where name = seq_name;
end if;
select currval into ret from sequences where name = seq_name limit 1;
return ret;
end;
6-4. 시퀀스 프로시저 실행
call create_sequence('seq_member');
6-5. nextval 함수 사용
select nextval('seq_member') from dual;
MySQL에서 오라클의 시퀀스 기능 구현은 어렵지 않게 가능했고,
날마다 시퀀스 값을 초기화하는 기능도 비교적 쉽게 구현이 가능했다.
날마다 값을 1로 초기화하게끔 했지만
필요에 따라 날짜를 넣는다던지 하는 기능들을 사용할 수 있을 것 같다.
참고: