问题描述
大家好,我对 Liquibase 有疑问
<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。最后删除旧表。