10

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

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

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

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

4

3 回答 3

7

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

dropNotNullConstraint

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

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

于 2014-04-15T23:19:42.770 回答
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')

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

于 2010-09-01T16:57:05.317 回答
1

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

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

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

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

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

于 2013-05-13T09:16:22.473 回答