gpt4 book ai didi

sql - Liquibase 改变列约束

转载 作者:数据小太阳 更新时间:2023-10-29 02:22:00 30 4
gpt4 key购买 nike

我想从一个具体的例子开始,在这个例子中,创建一个表的列具有一个约束,表明该列是一个外键:

<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 inMemory DB 没有问题...但是 cmon...这不是理想的对吧?)
  • 将整个列放到我自己的 changeSet 中,然后使用新的约束再次添加它,这可能有意义,因为列名可能会更改为 FK_TABLE_NEW 无论如何......但这不是生产环境的真正可能性
  • 以某种方式改变该约束 -> 但是如何!?文档没有帮助...

下一个问题是,如果有

为什么要有这种约束方式
<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 专家的公司的正确决定......

最佳答案

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

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

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

所以在发布之后你必须创建新的changeSet

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

或多或少,您还需要完全按照在数据库上使用纯 sql 执行的操作。此时 liquibase 或多或少只是将您的 changeSets 转换为 sql 并将它们应用于数据库。因此,一旦找到使用 slq 进行更改的方法,也应该可以将它们放入 liquibase 变更集中。

关于sql - Liquibase 改变列约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21942592/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com