티스토리 뷰

반응형

목차

     


    MySql에서 Oracle처럼 Sequence 사용하기

    오라클에 익숙하신 분들은 아시겠지만, 오라클의 Sequence 기능은 매우 편리합니다. 하지만 MySql에서는 Sequence 기능을 사용하고 싶어도 사용할 수가 없습니다. 기능을 지원하지 않기 때문이죠. 그래도 사용할 수 있는 방법은 존재합니다. 오라클처럼 다이렉트로 지원해주지는 않지만, 기능이 없다면 만들어서 비슷하게 사용하면 됩니다. 아래와 같은 순서대로 진행하면 MySql에서도 오라클처럼 Sequence 기능을 사용할 수 있습니다. 함께 보도록 하죠.

     

     

    Sequence를 사용하는 테이블 만들기

     

     

    CREATE TABLE SEQUENCES
    (
        NAME VARCHAR(16)
      , CURRVAL BIGINT UNSIGNED
    )
    ENGINE = InnoDB

     

    가장 먼저 해야 할 작업은 Sequence를 사용 할 테이블을 생성하는 것입니다.

    오라클에서 생성하는 Sequence기능을 대신하여 사용되는 테이블입니다.

    NAME 항목에는 Sequence 이름을 넣으시고, CURRVAL 항목에는 Sequence의 순서를 넣으시면 됩니다.

    ex) NAME = 'mySequence', CURRVAL = 1

     

     

    Sequence를 생성하는 프로시저 만들기

     

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

     

    다음은 좀 전에 생성했던 Sequence 테이블에 Sequence를 생성 해주는 프로시저를 만들어야 합니다. 

    오라클의 Sequence 생성하기와 같은 기능을 수행한다고 보시면 됩니다.

    IN에는 사용할 Sequence의 이름을 설정해주시면 됩니다.

    DELETE와 INSERT가 동시에 존재하는 이유는, Sequence의 이름이 중복되는 것을 방지하기 위함입니다.

    이미 동일한 이름의 Sequence가 존재한다면, 기존의 Sequence는 지우고 새로운 Sequence로 대체합니다.

    사용 중이던 Sequence가 삭제되므로 신중하게 사용하셔야 합니다.

    기존에 사용하던 Sequence가 삭제되는 것을 원치 않는다면 DELETE문은 제거하고 사용하셔도 무방합니다.

     

     

    nextval 함수 만들기

     

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

     

    오라클의 nextval 기능을 대체할 수 있는 함수를 만들어 사용해야 합니다.

    함수를 사용해야 하기 때문에, 기존 오라클에서 사용하던 문법과는 약간의 차이가 존재합니다.

    오라클은 Sequence의 내부지원으로 nextval을 바로 사용할 수 있지만, MySql은 함수를 만들어 사용하기 때문입니다.

    오라클 : Sequence이름.nextval

    MySql : nextval('Sequence이름')

    이렇게 함수를 호출해주면 원하는 Sequence의 값이 1 증가하게 됩니다.

     

     

     

     

    Sequence를 생성하는 프로시저 실행하기

     

    CALL create_sequence('UserSequence');

     

    조금 전에 생성했던 프로시저를 실행해서 새로운 Sequence를 생성해줍니다.

    해당 쿼리를 실행하면 UserSequence라는 이름의 Sequence가 생성됩니다.

    Sequence가 생성되면 기본값으로 0이 할당됩니다.

     

     

    nextval 사용하기

     

    마지막으로 nextval를 사용하는 방법만 남았습니다.

    SELECT nextval('UserSequence'FROM DUAL

     

    이렇게 사용하면 UserSequence의 값이 1 증가되어 보입니다.

    실무에서는 사실 이렇게 쓸 일이 없겠죠.

    보통은 INSERT문을 사용할 때 다음과 같이 Sequence 기능을 사용하게 됩니다.

     

    INSERT INTO USER_INFO
    (
        NUM
      , USER_ID
    , USER_NM
    )
    VALUES
    (
        (SELECT nextval('UserSequence'FROM DUAL)
    , 'linebeats'
    , '라인비츠'
    )

     

     

    마무리

     

    조금 귀찮은 일이지만, MySql에서도 충분히 Sequence 사용이 가능합니다. 이외에도 오라클이 여러 가지 편리한 기능들이 많은데, 역시 DB의 왕이라고 불리던 이유가 아닐까 하네요. 이상 포스팅 마치겠습니다. 감사합니다.

     

    반응형