목차

MySQL Sequence 시퀀스

MyISAM 기반 Sequence

Real MySQL 1판 922페이지

create table jpa_sequences ( name varchar(16) NOT NULL, curval bigint not null, primary key(name)) ENGINE=MyISAM;

insert into jpa_sequences set name='books', curval=(@v_current_value:=1) on duplicate key update curval=(@v_current_value:=curval+1);

select @v_current_value


        final EntityManager entityManager = getEntityManager();
        final Query generateNextSequenceQuery = entityManager.createNativeQuery("insert into jpa_sequences set name=?, curval=(@v_current_value\\:=1) on duplicate key update curval=(@v_current_value\\:=curval+1);");
        generateNextSequenceQuery.setParameter(1, sequenceName);
        generateNextSequenceQuery.executeUpdate();
        final Query nextSequenceQUery = entityManager.createNativeQuery("select @v_current_value;");
        Object nextSequenceObject = nextSequenceQUery.getSingleResult();

        if(nextSequenceObject instanceof BigInteger) {
            return ((BigInteger)nextSequenceObject).longValue();
        }

        return (Long)nextSequenceObject;

MyISAM과 InnoDB를 섞어서 사용할 경우 Bakcup/Recovery에 문제가 발생할 수 있다고 한다. 따라서 실전에서는 시퀀스 전용 스키마로 독립시키지 않는한 사용하기 힘들다.

InnoDB 기반 Sequence

InnoDB 기반 Multi Sequence