Liquibase:将 autoIncrement 列添加到已存在数据的表中

问题描述

大家好,我对 Liquibase 有疑问

我使用经典变更集创建了一个表 (Postgresql)

<changeSet id="create_table">
    <createTable tableName="table" schemaName="schema">
        <column name="name" type="varchar">
            <constraints nullable="false"/>
        </column>
        <column name="surname" type="varchar">
            <constraints nullable="false"/>
        </column>
    </createTable>
</changeSet>

我已经向该表中添加了一些数据。 我想添加一个新列 'id' 并将其作为自动增量列的主键。 我该怎么做?

因为如果我尝试添加这样的变更集:

<changeSet id="added_pk">
    <addColumn tableName="table"
               schemaName="schema">
        <column name="id" type="bigint">
            <constraints unique="true" nullable="false" uniqueConstraintName="PK_TABLE_ID"/>
        </column>
    </addColumn>
    <addAutoIncrement columnDataType="bigint"
                      columnName="id"
                      tableName="table"
                      schemaName="schema"
                      incrementBy="1" startWith="1"/>
</changeSet>

运行脚本时出现错误:“关系“表”的列“id”包含空值”。 这取决于已经存在的值。我该如何处理这种情况? (我更喜欢避免在添加新列之前截断所有数据)

非常感谢! 问候

解决方法

重命名数据库中的当前表。删除 liquibase 更改日志。重新运行包含新 id 字段的 liquibase 文件(您可以组合两个变更集,这样您也可以决定 id 字段的位置)。创建新表后,您可以将数据从旧表转移到新表中。这样旧表中的数据将自动接收 ID。最后删除旧表。