【问题标题】:Liquibase drop constraint without knowing it's name不知道它的名称的 Liquibase 丢弃约束
【发布时间】:2011-04-06 19:16:41
【问题描述】:

我们使用 liquibase 来跟踪我们的数据库更改。 第一个 changeSet 包含这些行:

<column name="SHORT_ID" type="INTEGER">
   <constraints unique="true" />
</column>

基本上这意味着 SHORT_ID 列具有唯一约束,但此约束的名称可以是任何名称,而且每次通常都不同(我们针对 H2 数据库运行一些集成测试,并且每次运行测试时都会创建新的基础)

所以.. 问题是:我无法更改第一个 changeSet 但现在我们必须摆脱这个唯一约束。有什么想法可以通过使用 liquibase 来实现吗?

【问题讨论】:

    标签: java sql constraints h2 liquibase


    【解决方案1】:

    H2 删除约束的 SQL 需要一个约束名称。我不记得 H2 中自动生成的约束名称是随机的还是跨数据库一致的。

    如果它是常量,您可以使用普通的 liquibase 标签,它会正常工作。

    如果它是随机的,则必须从 information_schema 中获取约束名称。 H2 可能允许类似:

    alter table TABLE_NAME drop constraint 
          (select unique_index_name 
                  from information_schema.constraints 
                  where table_name='TABLE_NAME' and column_name='SHORT_ID')
    

    如果没有,您可能需要创建一个自定义 liquibase 更改(http://liquibase.org/extensions 使用 2.0,http://www.liquibase.org/manual/custom_refactoring_class 使用 1.9)进行调用并放弃约束。

    【讨论】:

    • 之前尝试过.. 不能在 drop 约束命令中使用 select 子句 :) 并且约束名称不一致.. 我试图避免那些自定义重构类,但它看起来真的是唯一的选择..所以感谢您的方法和+1,如果没有人提出没有自定义 liquibase 更改的解决方案,那么这将是我接受的答案.. ;]
    • 我遇到了同样的问题,在 ms sql server 上的 drop 约束命令中不允许选择。我最终做了以下操作,以删除表容器 bowerstudios.com/node/995 上 col 测量的唯一约束(链接,因为注释框中的字符不足)。解决方案与 Nathan 的方案相呼应,但针对 ms sql server 进行了调整。
    【解决方案2】:

    对于 HSQL,Nathan 建议的查询不起作用(更改表 TABLE_NAME 删除约束 (选择 unique_index_name 来自 information_schema.constraints 其中 table_name='TABLE_NAME' 和 column_name='SHORT_ID'))

    这是因为,DDL 和 SQL 不能混用。

    HSQL 似乎无法通过在运行时知道名称来删除约束(在删除带有约束的列之前,我需要在回滚中这样做)。这对于 Oracle 和 MSSQL 是可能的。

    我所做的是通过 hbm 文件(休眠)获取生成的数据库。由于休眠不支持命名唯一键约束,因此例如使用 liquibase(对于 HSQL)不可能删除这些带有约束的列。我们有基于 HSQL 的测试来测试整个东西。获得 HSQL 的解决方案会很好。

    现在,我只是硬编码唯一约束名称(一种解决方法)

    【讨论】:

      【解决方案3】:

      Liquibase 提供了一种在不知道约束名称的情况下删除非空约束的实现。问这个问题时它可能不存在(我意识到它已经很老了)。

      dropNotNullConstraint

      <dropNotNullConstraint catalogName="cat"
                  columnDataType="int"
                  columnName="id"
                  schemaName="public"
                  tableName="person"/>
      

      dropUniqueConstraint 存在,但您可能已经知道它,因为它需要约束名称。

      【讨论】:

        猜你喜欢
        • 2021-08-18
        • 1970-01-01
        • 2014-09-12
        • 2023-03-10
        • 2011-02-02
        • 2011-04-26
        • 2012-02-18
        • 2012-09-05
        • 2017-04-18
        相关资源
        最近更新 更多