我想从一个特定的示例开始,其中创建的表中的列具有指示该列是外键的约束:
<changeSet id="1" author="A1">
<createTable tableName="TABLE_A">
<!-- Other columns -->
<column name="FK_TABLE_B" type="BIGINT">
<!-- the 'TABLE_B' will be renamed soon ! -->
<constraints references="TABLE_B(ID_PK)"
foreignKeyName="JUST_UNIQUE_I_GUESS" nullable="false" />
</column>
</createTable>
</changeSet>
现在第一个问题:假设TABLE_B将被重命名为TABLE_NEW…我将如何更改上述约束,使其指向重命名的表列ID_PK?
我看到了一些可能性:
接下来的问题是,如果有一个
<addForeignKeyConstraint ...>
以及?
所以目前我不觉得Liquibase在所有只是因为这是我第一次尝试改变现有的changeSet和我最大的问题是:这是一个不理解的最佳实践的问题,或者实际上是一个问题的"不那么冗长"留档?
感谢任何帮助!
我所尝试的
假设上述约束定义在某种程度上导致与a相同
<addForeignKeyConstraint ...>
标签,但属性较少。所以我想我可以用
<dropForeignKeyConstraint ...>
标记首先删除ForeignKeyConstraint,然后添加一个新的。但是它仍然告诉我,当尝试在H2内存DB中执行第一个changeSet时,它不会找到表TABLE_B。
我的变更集看起来像这样:
<changeSet id="1" author="A2">
<dropForeignKeyConstraint baseTableName="TABLE_A"
constraintName="JUST_UNIQUE_I_GUESS" />
<addForeignKeyConstraint
constraintName="JUST_UNIQUE_I_GUESS"
referencedTableName="TABLE_NEW" baseColumnNames="FK_TABLE_B"
baseTableName="TABLE_A" referencedColumnNames="ID_PK" />
</changeSet>
背景资料
因为我们目前只是使用内存DB构建POC(H2),所以在我们有一个最终的方案状态之前,只更改第一个更改集没什么大不了的…但是如果你已经有了一个现有的DB,数百万个入口和其他东西,如何处理这些事情呢?目前,我非常怀疑Liquibase对于一个没有雇佣Liquibase专家的1k开发人员的公司来说是正确的决定…
您应该只修改您的变更集,只要它们(即与变更集一起使用的软件/数据库)尚未发布。
我们将变更集文件(连同代码)保存在我们的源代码存储库中。在开发阶段,每个人都可以更改为当前正在开发的版本定义的变更集。
一旦版本发布,变更集文件就被认为是固定的,不应再更改。(随着版本的发布,软件发布,客户就有了一个反映变更集定义的数据库)。
因此,在发布后,您必须创建新的changeSet
或多或少,你需要在数据库上做与纯sql完全相同的事情。此时,liquibase或多或少会将您的changeSet转换为sql并将它们应用到数据库中。因此,一旦您找到了使用slq进行更改的方法,也应该可以将这些更改放入liquibase更改集中。