我想从一个特定示例开始,其中创建一个表,其中一个列具有一个约束,指示此列是外键:
<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 ...我将如何更改上述约束以使其指向重命名的Tables列ID_PK?
我看到了一些可能性:
接下来的问题是,如果存在
,为什么要采用这种约束方式<addForeignKeyConstraint ...>
以及?
所以目前我根本不觉得Liquibase只是因为这是我第一次尝试改变现有的changeSet而我最大的问题是:这是一个不理解最佳实践的问题,还是实际上是“不那么语言”的问题“文件?
感谢您的帮助!
我尝试了什么
假设上面的约束定义以某种方式导致与使用
完成时相同<addForeignKeyConstraint ...>
标记,但属性较少。所以我想我可以使用
<dropForeignKeyConstraint ...>
标签首先删除ForeignKeyConstraint,然后添加一个新的。但它仍然告诉我,当尝试在H2内存数据库中执行第一个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>
背景资料
由于目前只使用内存数据库(H2)构建POC,所以只需更改第一个changeSet直到我们拥有相当的最终方案状态......但是如何处理这些事情是没什么大不了的如果你已经有一个现有的数据库,数以百万计的东西?目前,我非常怀疑Liquibase是一家拥有1k +开发人员而不雇用Liquibase专家的公司的正确决定......
答案 0 :(得分:6)
您只应修改您的更改集,只要它们(相应的是与更改集一起使用的软件/数据库)尚未发布。
我们将变更集文件(以及代码)保存在源代码存储库中。在开发阶段,每个人都可以更改为当前正在开发的版本定义的变更集。
一旦版本发布,变更集文件就被认为是固定的,不应再被更改。 (随着软件的发布,客户将拥有一个反映变更集定义的数据库)。
因此,在发布后,您将不得不创建新的changeSet
或多或少,您需要完全按照数据库上的纯SQL执行操作。 此时liquibase或多或少只会将您的changeSet转换为sql并将它们应用于数据库。因此,一旦您找到了使用slq进行更改的方法,也应该可以将这些更改为liquibase更改集。