我需要更改一个表以添加一列并将其包含到主键中。所以我有一个 luiqbase 变更集:
我想知道如何分离关注点并正确实施回滚。
- addColumn 和 PK 在一个变更集中进行更改
<changeSet author="rahul" id="change_pk">
<addColumn tableName="posts">
<column name="aux_id" type="INT" defaultValue="0"/>
</addColumn>
<dropPrimaryKey tableName="posts"/>
<addPrimaryKey tableName="posts" columnNames="id,aux_id"/>
<rollback>
<dropPrimaryKey tableName="posts"/>
<addPrimaryKey tableName="posts" columnNames="id"/>
</rollback>
</changeSet>
这种方法让我担心的是,如果我无法创建列,我将删除 PK 并重新创建它,这可能会影响数据库响应时间,假设表很大。然而,这使得所有这些变化都是原子的。
- 将 PK 更改移动到不同的变更集
<changeSet author="rahul" id="add_col">
<addColumn tableName="posts">
<column name="aux_id" type="INT" defaultValue="0"/>
</addColumn>
</changeSet>
<changeSet author="rahul" id="change_pk">
<dropPrimaryKey tableName="posts"/>
<addPrimaryKey tableName="posts" columnNames="id,aux_id"/>
<rollback>
<dropPrimaryKey tableName="posts"/>
<addPrimaryKey tableName="posts" columnNames="id"/>
</rollback>
</changeSet>
因此,我将能够更好地控制 PK 更改的回滚,这将删除并重新创建旧的。但是,有一个问题,当change_pk
没有应用变更集时 - 我有一个列,应该包含在 PK 中,但事实并非如此,这使得系统容易受到违反唯一约束的影响。