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

时间:2010-09-01 12:59:40

标签: java sql constraints h2 liquibase

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

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

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

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

3 个答案:

答案 0 :(得分:5)

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

dropNotNullConstraint

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

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

答案 1 :(得分:3)

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中)进行调用并删除约束。

答案 2 :(得分:1)

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

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

通过在运行时知道名称来删除约束似乎不可能使用HSQL(在删除具有约束的列之前,我需要在回滚中使用它)。这适用于Oracle和MSSQL。

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

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