MariaDB 시퀀스 지원을 하여 사용하게 되었어요.
이전 프로젝트에서는 시퀀스 테이블을 이용하던지 했는데 이번에 10.3 이상에서는 정식으로 지원을 하게 되어 사용하게 되었어요.
create-sequence
CREATE SEQUENCE
Creates a sequence that generates new values when called with NEXT VALUE FOR.
mariadb.com
//버전확인방법 SELECT version(); CREATE SEQUENCE SQ_FABS_BZOB_INFO START WITH 1 INCREMENT BY 1;만드는 방법은 간단해요 시퀀스명, 시작 시점, 증가 값
NEXT VALUE FOR sequence 또는 NEXTVAL(sequence_name) 방법이있어요. Oracle에서 sequence_name.nextval 처럼 사용도 가능하다는데 Oracle mode (SQL_MODE=ORACLE)를 사용하면 가능하다고 하는데 여기에는 적용이 안되어 위 두가지 방법중에 하나를 사용하고있어요next-value-for-sequence_name
NEXT VALUE for sequence_name
Generate next value for a SEQUENCE. Same as NEXTVAL().
mariadb.com
티스토리 뷰
MariaDB 버전 10.3 버전 이후부터 시퀀스 생성이 가능해졌다.
AUTO_INCREMENT가 있는데 굳이 시퀀스가 필요할까 했지만, 생각보다 필요할 때가 있었다.
생성
CREATE SEQUENCE MY_SEQ START WITH 1 INCREMENT BY 1 MAXVALUE 999999 CYCLE;시작값은 1이고 증가값은 INCREMENT 값을 따라 1씩 증가하고, 최대값은 999999가 된다.
시퀀스 사용
SELECT NEXTVAL(MY_SEQ)시퀀스 확인
SELECT LASTVAL(MY_SEQ)시퀀스 초기화
ALTER SEQUENCE MY_SEQ RESTART 1;오라클은 시퀀스란 오브젝트가 있어서 이를 이용하여 채번을 관리한다. 반면에 MariaDB는 시퀀스란 오브젝트는 따로 존재하지 않는다. 대신에 테이블별 특정 컬럼에 auto_increment라는 옵션을 사용하여 채번을 관리할 수 있다. 이 경우엔 단순히 INSERT 되는 interface 테이블에 설정해서 사용한다. 오라클처럼 일련번호를 발급하고 이를 활용하는 경우엔 함수를 만들어 구현한다. 이 방식은 새로 입력되는 ROW에 대해 유일한 값을 자동으로 부여하는 옵션을 가진다. 테이블 생성 시, 컬럼에 AUTO_INCREMENT 옵션을 정의하는데 한번 증가하면 자동적으로 줄어들진 않는다. 기본 값은 1부터, 1씩 증가하며 따로 설정이 가능하다. 결과 : 실무 활용 예시로 부모 테이블에 AUTO_INCREMENT 컬럼으로 PK 생성후 INSERT 시 자식 테이블에 LAST_INSERT_ID()를 활용하여, 입력된 값을 자동으로 할당 받아서 INSERT가 가능하다.채번 시 고려사항
채번 방식장점단점 AUTO_INCREMENT
시퀀스 대체함수
auto_increment 방식
SEQ_NO 1
2
5
10
11
12
13
14
함수를 활용한 채번방법
오라클처럼 일련번호를 발급받아서 문자열과 조합하여 id를 생성하는 등 특별한 규칙을 부여하여 사용하는 경우엔 해당 방법을 사용한다. 오라클의 시퀀스와 사용방식이 유사하여 많은 이들이 이를 채택하는데 AUTO_INCREMENT 방식보다는 빠르진 않고, 객체 함수가 많아지게 되는 단점이 존재한다. 직접 사용해보면 스토리지 엔진을 myisam으로 하여 생성하는 것이 보다 바람직한 방법이다. myisam 엔진의 특성은 DML 수행하게 되면 바로 COMMIT되는 특성을 지니고 있다. 이는 오라클의 시퀀스와 유사한 메커니즘이고, 해당 방식으로 수행해야 채번 시에 경합을 최소화할 수 있다.
1. 채번용 테이블 생성 CREATE TABLE TB_SEQ_NAME ( seq_cur_value bigint unsigned NOT NULL DEFAULT 1 COMMENT '시퀀스 현재값' ,LAST_UPDATE_DATE DATETIME null default now() ,PRIMARY KEY (seq_cur_value) ) ENGINE=MyISAM ROW_FORMAT=Compact COMMENT='TB_SEQ_NAME 시퀀스 테이블' DEFAULT CHARSET=utf8 DEFAULT COLLATE=utf8_bin; 2. 채번값 초기화 insert into TB_SQ_LD_ORDNO values (1, now()); 3. NEXTVAL 채번함수 생성 DELIMITER ;; CREATE FUNCTION SEQ_NAME_NEXTVAL() RETURNS bigint LANGUAGE SQL NOT DETERMINISTIC MODIFIES SQL DATA SQL SECURITY INVOKER COMMENT '' MainBlock: BEGIN UPDATE TB_SEQ_NAME SET seq_cur_value = (@v_current_value:= (seq_cur_value+1 )), `LAST_UPDATE_DATE`=now() ; RETURN @v_current_value; END MainBlock ;; 4. CURR 채번함수 생성 -- 시퀀스 현재값 delimiter ;; CREATE FUNCTION SEQ_NAME_CURRVAL() RETURNS int LANGUAGE SQL NOT DETERMINISTIC MODIFIES SQL DATA SQL SECURITY INVOKER MainBlock: BEGIN DECLARE cur_val int; SELECT seq_cur_value INTO cur_val FROM TB_SEQ_NAME ; RETURN cur_val; END MainBlock;; delimiter ; 5. 사용 예제 insert into employees values( SEQ_NAME_NEXTVAL(), '홍길동', '남', '02.1111.2222');results matching ""
No results matching ""
꽤 오래전부터 MariaDB 에서도 Sequence (시퀀스) 가 사용 가능하다
정확히는 마리아디비 10.3 버전부터 추가된 기능이다
현재 기준으로 마리아디비는 10.6.4 가 최신 버전이고
10.7.0 으로 프리뷰 버전이 공개된 상태이다
구분) CREATE SEQUENCE [ID] WITH 1 INCREMENT BY 1예) CREATE SEQUENCE BOMZ WITH 1 INCREMENT BY 1
실제 MariaDB 의 시퀀스를 생성하는 명령ㅇ어 예시이다
위처럼 실행하면 1부터 시작해서 1씩 증가하는 Sequence 가 생성된다
CREATE SEQUENCE [ID] WITH 4 INCREMENT 3
이렇게하면 어떻게 될까?
당연히 4부터 시작해서 3씩 증가하는 시퀀스가 생성된다
호출 시 4, 7, 10, 13 ... 식으로 시퀀스 값을 받을 수 있다
그렇다면 만들어진 Sequence 를 어떻게 실행할 수 있을까?
구문 1) SELECT NEXTVAL([ID])예 1) SELECT NEXTVAL(BOMZ)
구문 2) SELECT [ID].NEXTVAL
예 2) SELECT BOMZ.NEXTVAL
MariaDB Sequence 의 값을 가져오는 방법은 총 3가지가 있는데 그 중 사용하기 편한 방법은 위의 2가지이다
구문) SELECT LASTVAL([ID])예) SELECT LASTVAL(BOMZ)
마지막으로 새로운 값을 가져오는게 아니라 마지막으로 사용됐던 값을 가져오는 방법이다