首页 > 解决方案 > liquibase 中的自动增量

问题描述

如何使用 liquibase 在 PostgreSQL 中的列上使用“startWith”设置自动增量属性?

出于某种原因,它总是从 1 开始。我尝试使用自定义序列,但这也无济于事。

<column autoIncrement="true" startWith="100" name="id" type="bigint">

这是我当前的列定义,它不起作用。

编辑:

我想使用 liquibase 从 csv 导入数据。我尝试了以下方法:

<changeSet author="author" id="createSequence">
    <createSequence
                    incrementBy="1"
                    sequenceName="mytable_id_seq"
                    startValue="1000"/>
    </changeSet>
</changeSet>


<changeSet author="author" id="1-mytable">
    <createTable tableName="mytable">
        <column name="id" type="BIGSERIAL" defaultValueComputed="nextval('mytable_id_seq')">
              <constraints primaryKey="true" primaryKeyName="mytable_pkey"/>
        </column>
    </createTable>

    <loadData encoding="UTF-8"
              file="liquibase/data/mytable.csv"
              separator=","
              tableName="mytable">
    </loadData>
</changeSet>

如果我尝试这样做,我会收到以下错误“序列“table_id_seq”的currval 尚未在此会话中定义”,我认为它使用来自公共模式的序列,而不是我设置为 liquibase 的序列。

  1. 我尝试的另一件事是手动更新它:

ALTER SEQUENCE mytable_id_seq 以 100 重新启动;

在这种情况下,使用的序列是来自公共模式的序列,但我想使用设置为 liquibase 的模式

标签: javapostgresqlliquibase

解决方案


如果您要设置自己的增量和序列,请不要使用 bigserial,它是一个特定于 postgres 的自动增量 bigint,请使用 bigint。“数据类型 smallserial、serial 和 bigserial 不是真正的类型,而只是用于创建唯一标识符列的符号方便(类似于某些其他数据库支持的 AUTO_INCREMENT 属性)。在当前实现中,指定:”

CREATE TABLE tablename (
    colname SERIAL
);

是相同的

CREATE SEQUENCE tablename_colname_seq AS integer;
CREATE TABLE tablename (
    colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;

从这里

https://www.postgresql.org/docs/12/datatype-numeric.html


推荐阅读