java - 改变 H2 中的序列

标签 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;
...

}

现在,由于我在该表中已有实体(具有我使用的最后一个序列的 ID),因此我需要相应地设置该序列的当前值。 为此,我写道:

<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 中设置序列的当前值?

最佳答案

你试过这个吗?

alter sequence <your_sequence_name> restart with <next_value>

例如:

alter sequence BOOKS_SEQ restart with 500

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

关于java - 改变 H2 中的序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41100306/

相关文章:

java - 是什么导致java以不同的方式对待ArrayList和Integers这两种对象类型?

java - 如何在 JButton 上的较大 imageIcon 上设置较小的 ImageIcon ?虽然我希望两个图像都可见

java - Android 一个 Activity 两个动画

java - EclipseLink - 并发异常 - signalAttemptedBeforeWait

mysql - Liquibase介绍现有项目和MySQL

java - 如何反转用户接受的Java中的数字并添加两个反转的数字

google-app-engine - 我可以将 JPA 2.0 与 Google App Engine 一起使用吗?

@MapsId、@EmbeddedId 的 Hibernate 异常

mysql - CURRENT_TIMESTAMP 在 h2 中以毫秒为单位

java - Spring Boot——启动时不运行 data.sql