Liquibase放弃约束而不知道它的名字

vrm*_*vrm 7 java sql constraints h2 liquibase

我们使用liquibase来跟踪我们的数据库更改.首先,changeSet包含以下行:

<column name="SHORT_ID" type="INTEGER">
   <constraints unique="true" />
</column>
Run Code Online (Sandbox Code Playgroud)

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

所以..问题是:我无法改变这第一个changeSet但现在我们必须摆脱这个独特的约束.有任何想法如何通过使用liquibase实现这一目标?

Nat*_*and 5

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')
Run Code Online (Sandbox Code Playgroud)

如果没有,您可能需要创建一个自定义 liquibase 更改(http://liquibase.org/extensions with 2.0,http://www.liquibase.org/manual/custom_refactoring_class in 1.9)来调用并删除约束。

  • 之前试过.. 在 drop 约束命令中不能有 select 子句 :) 并且约束名称不一致.. 我试图避免那些自定义重构类,但它似乎真的是唯一的选择..所以感谢您的方法和 +1 和如果没有人提出没有自定义 liquibase 更改的解决方案,那么这将是我接受的答案.. ;] (2认同)

Dav*_*nce 5

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

dropNotNullConstraint

<dropNotNullConstraint catalogName="cat"
            columnDataType="int"
            columnName="id"
            schemaName="public"
            tableName="person"/>
Run Code Online (Sandbox Code Playgroud)

一个dropUniqueConstraint存在,但你可能已经知道这件事,因为它需要约束的名字。