使用Liquibase、postgreSQL和序列插入新数据

6
如果我的id是连续的,我该如何使用Liquibase为PostgreSQL创建插入记录。我尝试了以下方式:
<changeSet author="rparente" id="service-1.1-2019-01-09-01">
        <insert tableName="tenant">
            <column name="id"defaultValueSequenceNext="hibernate_sequence"/>
            <column name="description" value="Prueba"/>
            <column name="name" value="antel"/>
            <column name="service_id" value="antel"/>
        </insert>
    </changeSet>

我尝试使用

<changeSet author="rparente" id="service-1.1-2019-01-09-01">
        <insert tableName="tenant">
            <column name="id"  value="nextval('hibernate_sequence')"/>
            <column name="description" value="Prueba"/>
            <column name="name" value="antel"/>
            <column name="service_id" value="antel"/>
        </insert>
    </changeSet>

错误信息为:

错误:null值违反非空约束条件,列名为"id"


未定义默认值。 - Renzo Parente
3个回答

9

我找到了在Postgres中插入数据的解决方案,该方案使用序列(无默认值)ID。

<changeSet author="author_name" id="service-1.1-2019-01-09-01"> 
    <insert tableName="tenant"> 
        <column name="id" valueSequenceNext="name_sequence"/> 
        <column name="description" value="TEST"/> 
        <column name="name" value="test"/> 
        <column name="service_id" value="testl"/> 
        <column name="status" value="ACTIVE"/> 
    </insert> 
</changeSet>

1
为我们工作过。谢谢 :-) - Marcus K.
你如何获取插入的id值? - ajayramesh
@ajayramesh 这是自动的,类似于自动生成的字段,但它是一个序列,通常会指定一个名称(建议),例如user_sequence或product_sequence。如果使用Hibernate创建数据库,则默认序列称为“hibernate_sequence”。 - Renzo Parente

1

请查看ColumnConfig文档。您应该可以设置valueComputed属性,并在其中调用Postgres函数:

<column name="id"  valueComputed="nextval('hibernate_sequence')"/>

我找到了插入<changeSet author="author_name" id="service-1.1-2019-01-09-01"> <insert tableName="tenant"> <column name="id" valueSequenceNext="name_sequence"/> <column name="description" value="TEST"/> <column name="name" value="test"/> <column name="service_id" value="testl"/> <column name="status" value="ACTIVE"/> </insert> </changeSet>的解决方案,谢谢! - Renzo Parente

1

就我而言,我需要先创建一个序列,然后再使用它。

<changeSet>
    <createSequence sequenceName="runtime_name_seq" dataType="bigint" incrementBy="1" maxValue="10000" minValue="1" startValue="1"/>
</changeSet>

<changeSet>
     <createTable tableName="runtime_name">
        <column name="id" type="INTEGER" defaultValueComputed="nextval('runtime_name_seq')">
            <constraints nullable="false" primaryKey="true" primaryKeyName="pk_runtime_name"/>
        </column>
    </createTable>
</changeSet>

这将创建一个SQL,使用的是Liquibase(我正在使用v3.8.1版本)。
CREATE TABLE public.runtime_name 
(
    index INTEGER DEFAULT nextval('runtime_name_seq') NOT NULL
)

在 Liquibase 3.8 中,您可以使用 autoIncrement="true",Liquibase 将生成一个 identity 列。 - user330315
是的,您可以使用autoIncrement来为您创建序列。在这种情况下,我们正在使用自己的序列。 - sendon1982

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接