티스토리 뷰

얼마전 프로젝트에서 Cubrid 에서 MySQL로 DB 를 변경해야 했습니다.도메인 규모가 크지 않기에 쉽게 생각했는데 rownum과 sequence 오브젝트를 MySQL 에서는 사용 불가능했습니다. 이미 거의 구축이 끝난 상태인데 몇몇 부분의 수정이 불가피 했죠.

MySQL 에서 rownum과 sequence 대체해보는 방법을 알아보겠습니다.


1.Rownum 사용하기

  • Cubrid (as-is)

    1
    2
    SELECT rownum
    FROM [테이블명]
    cs


  • Mysql  (to-be)

    1
    2
    SELECT (@rownum := @rownum + 1) AS rownum
    FROM [테이블명], (SELECT @rownum := 0) r;
    cs


2.Sequence 사용하기

  • Cubrid (as -is)

    -Next

    1
    2
    3
    4
    SELECT
        [시퀀스명].NEXT_VALUE
    FROM
        DB_ROOT
    cs

    -Current

    1
    2
    3
    4
    SELECT
        [시퀀스명].CURRENT_VALUE
    FROM
        DB_ROOT
    cs


  • Mysql (to-be)

    -Create Table (Sequence 용)
    Mysql 에서는 시퀀스 Object 자체가 존재하지 않기 때문에 시퀀스를 위한 테이블을 생성하고 컬럼속성중에   AUTO_INCREMENT 을 사용해야 됩니다.AUTO_INCREMENT 속성에 컬럼은 반드시 primary key 이여야 하고 다른 pk 컬럼을 허용하지 않습니다. 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    create table [테이블명]
    (
        sequence int auto_increment
            primary key
    )
    engine=InnoDB
    ;
     
     
    cs

    -Next
    테이블에 한 개의 시퀀스를 저장합니다. value가 0으로 하드코딩 되있지만 실제 insert돼는 값은 순차적으로 증가합니다. 그 이후에  LAST_INSERT_ID() 내장 함수로 insert 한 값을 가져올수 있습니다. LAST_INSERT_ID() 는 세션에 유일하기 때문에 스레드에 안전합니다.

    1
    2
    INSERT INTO [테이블명](sequence) VALUES (0);
    SELECT LAST_INSERT_ID();
    cs


    MyBatis 를 이용할경우 아래와 같이 사용하실수 있습니다. LAST_INSERT_ID() 반환값이 SequenceDto 의 sequence 필드에 담기게 됩니다.

    SequenceDto.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package info.m2sj;
     
    public class SequenceDto {
        private int sequence;
     
        public int getSequence() {
            return sequence;
        }
     
        public void setSequence(int sequence) {
            this.sequence = sequence;
        }
    }
     
    cs

    generate.xml

    1
    2
    3
    4
    5
    6
    <insert id="generate_seq" parameterType="com.m2sj.SequenceDto">
        INSERT INTO [테이블명](sequence) VALUES (0)
        <selectKey keyProperty="sequence" resultType="int">
            SELECT LAST_INSERT_ID()
        </selectKey>
    </insert>
    cs


    -Current

    현재 시퀀스 값을 가져오기 위해서는 메타 테이블정보를 조회 하시면 됩니다. 메타정보의 값은 현재값이 아닌 next 정보가 있기 때문에 -1 을 해주셔야 됩니다.

    1
    2
    3
    4
    5
    6
    7
    SELECT AUTO_INCREMENT - 1
    FROM
      information_schema.tables
    WHERE
      table_schema = DATABASE()
      AND table_name = '[테이블명]';
     
    cs

     


Mysql 에서 rownum 과 sequence 사용법을 알아 보았습니다. 이와 별개로 mysql 에서는 대소문자 구분을 하기 때문에 sql 문이 대문자로만 돼있다면 전부 변경해야 됩니다.(mysql에 대소문자 구분을 ignore 하는 옵션이 있지만 권장하지는 않습니다.)

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크