提问者:小点点

液基改变柱约束


我想从一个特定的示例开始,其中创建的表中的列具有指示该列是外键的约束:

<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?

我看到了一些可能性:

  • 修改changeSet本身(内存中的H2没有问题DB…但是cmon…那不是理想的对吗?)
  • 在我自己的changeSet中删除整个列,并使用新的约束再次添加它,这可能是有意义的,因为列名无论如何都可能会更改为FK_TABLE_NEW……但对于生产环境来说,这不是一个真正的可能性
  • 以某种方式改变这种约束-

接下来的问题是,如果有一个

<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开发人员的公司来说是正确的决定…


共1个答案

匿名用户

您应该只修改您的变更集,只要它们(即与变更集一起使用的软件/数据库)尚未发布。

我们将变更集文件(连同代码)保存在我们的源代码存储库中。在开发阶段,每个人都可以更改为当前正在开发的版本定义的变更集。

一旦版本发布,变更集文件就被认为是固定的,不应再更改。(随着版本的发布,软件发布,客户就有了一个反映变更集定义的数据库)。

因此,在发布后,您必须创建新的changeSet

  1. 删除外键约束
  2. 重命名你的表
  3. 添加新的外键约束

或多或少,你需要在数据库上做与纯sql完全相同的事情。此时,liquibase或多或少会将您的changeSet转换为sql并将它们应用到数据库中。因此,一旦您找到了使用slq进行更改的方法,也应该可以将这些更改放入liquibase更改集中。