【问题标题】:Insert new data using Liquibase, postgreSQL and sequence使用 Liquibase、postgreSQL 和序列插入新数据
【发布时间】:2019-01-10 15:12:18
【问题描述】:

如果我的 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>

错误是:

错误:“id”列中的空值违反了非空约束

【问题讨论】:

  • 定义为无默认值

标签: postgresql liquibase


【解决方案1】:

我找到了在 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>

【讨论】:

  • 为我们工作。谢谢:-)
  • 如何获取插入的id值?
  • @ajayramesh 是自动的,类似于自动生成的字段,但它是一个序列,通常指定一个名称(推荐),例如user_sequence或product_sequence,如果数据库是用Hibernate创建的默认序列称为“hibernate_sequence”
【解决方案2】:

对于我来说,我必须先创建一个序列,然后再使用它。

<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>

这将通过 Liquibase 创建一个 SQL(我正在使用 v3.8.1)

CREATE TABLE public.runtime_name 
(
    index INTEGER DEFAULT nextval('runtime_name_seq') NOT NULL
)

【讨论】:

  • 在 Liquibase 3.8 中。你可以使用autoIncrement="true",Liquibase 会生成一个identity
  • 是的,您可以使用自动增量,它会为您创建序列。在这种情况下,我们使用自己的序列
【解决方案3】:

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

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

【讨论】:

  • 我找到了插入的解决方案 thnk!
猜你喜欢
  • 2015-07-27
  • 2018-12-10
  • 2015-09-24
  • 2019-03-08
  • 1970-01-01
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多