在H2中改变序列

时间:2016-12-12 11:54:04

标签: java eclipselink h2 liquibase

我在生产中使用Postgres数据库,在测试中使用H2。 我想为现有表创建一个新序列 - 所以在Liquibase中我写了这个:

<changeSet id="Add sequence for BOOKS" author="library">
    <createSequence sequenceName="BOOKS_SEQ" incrementBy="500" startValue="1"/>
</changeSet>

我的实体看起来像这样:

@Entity
@Table(name = "BOOKS")
@SequenceGenerator(name = "BOOKS_SEQ", allocationSize = 500)
public class Book {

    @Id
    @GeneratedValue(generator = "BOOKS_SEQ", strategy = GenerationType.TABLE)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "AUTHOR_ID")
        private Author author;
...

}

现在,因为我已经在这个表中有实体(我使用的是最后一个序列的Ids),所以我需要相应地设置这个序列的当前值。 就此而言,我写道:

<changeSet id="Alter sequence for BOOKS" author="library">
    <sql dbms="postgresql">select setval('BOOKS_SEQ', (select nextval('OLD_SEQUENCE_UID')))</sql>
</changeSet>

<changeSet id="Add default value to BOOKS.ID" author="library">
    <addDefaultValue tableName="BOOKS" columnName="ID" defaultValueSequenceNext="BOOKS_SEQ"/>
</changeSet>

在Postgres(生产)中,似乎工作正常 - 但在H2中我得到一条错误消息“名为[BOOKS_SEQ]的序列设置不正确。其增量与其预分配大小不匹配”。

根据this - 我需要将start_value(或当前值)设置为大于500的值 - 但我无法弄清楚它是如何done in H2

所以我的问题是:如何在H2中设置序列的当前值?

1 个答案:

答案 0 :(得分:5)

你试过这个吗?

alter sequence <your_sequence_name> restart with <next_value>

例如:

alter sequence BOOKS_SEQ restart with 500

当我运行上面的命令时,我让BOOKS_SEQ将其当前值设置为499(因此下一个值将为500)。