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实现这一目标?
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)来调用并删除约束。
Liquibase提供了一种在不知道约束名称的情况下删除非空约束的实现。提出此问题时可能不存在(我知道它已经很老了)。
<dropNotNullConstraint catalogName="cat"
columnDataType="int"
columnName="id"
schemaName="public"
tableName="person"/>
Run Code Online (Sandbox Code Playgroud)
一个dropUniqueConstraint存在,但你可能已经知道这件事,因为它需要约束的名字。