我们使用liquibase来跟踪我们的数据库更改。 第一个changeSet包含这些行:
<column name="SHORT_ID" type="INTEGER">
<constraints unique="true" />
</column>
基本上这意味着SHORT_ID列具有唯一约束,但此约束的名称可以是任何内容,并且通常每次都不同(我们对H2数据库运行一些集成测试,每次运行测试时都会生成新的基础)
所以..问题是:我无法改变这第一个changeSet,但现在我们必须摆脱这个独特的约束。有任何想法如何通过使用liquibase实现这一目标?
答案 0 :(得分:5)
Liquibase提供了一种在不知道约束名称的情况下删除非空约束的实现。当问这个问题时我可能不存在(我意识到它已经很老了)。
<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的解决方案会很好。
现在,我只是硬编码唯一约束名称(解决方法)