Liquibase中的约束

时间:2020-07-22 13:24:04

标签: liquibase

href="{{i}}"

我已经进行了这样的迁移来创建表,现在我已经进行了更改并且需要进行其他迁移。在表中,名称字段是唯一的,我应该摆脱它,也就是说,名称不应该唯一,并且我需要对fam施加限制。一个家族不应分配给两个具有相同名称的角色。但是具有不同名称的角色可以包含相同的家族。预先感谢

1 个答案:

答案 0 :(得分:0)

如果要向现有架构中添加更改,则应保持现有更改不变,并编写新的changeSet。

所以为了执行要求

名称字段是唯一的,我应该摆脱它

您本可以使用<dropUniqueConstraint>更改,但是它需要一个constraintName属性。但是在创建名称时,您没有提供uniqueConstraintName作为其唯一约束,这使实现变得棘手。最好给您约束和索引名称。

因此,您可以执行以下操作:

  • 创建一个新列,例如 non_unique_name
  • 将所有数据从 name 复制到 non_unique_name
  • 放置名称
  • non_unique_name 列重命名为 name

changeSets可能看起来像这样:

<changeSet id="0.1.1.1" author="Bob">
    <preConditions onFail="MARK_RAN">
        <tableExists tableName="roles"/>
        <not>
            <columnExists tableName="roles" columnName="non_unique_name"/>
        </not>
    </preConditions>
    <comment>create a new column, e.g. non_unique_name</comment>
    <addColumn tableName="roles">
        <column name="non_unique_name" type="varchar(1024)">
            <constraints nullable="false"/>
        </column>
    </addColumn>
</changeSet>

<changeSet id="0.1.1.2" author="Bob">
    <preConditions onFail="MARK_RAN">
        <tableExists tableName="roles"/>
        <columnExists tableName="roles" columnName="non_unique_name"/>
        <columnExists tableName="roles" columnName="name"/>
    </preConditions>
    <comment>copy all the data from name to non_unique_name</comment>
    <update tableName="roles">
        <column name="non_unique_name" valueComputed="name"/>
    </update>
</changeSet>

<changeSet id="0.1.1.3" author="Bob">
    <preConditions onFail="MARK_RAN">
        <tableExists tableName="roles"/>
        <columnExists tableName="roles" columnName="name"/>
    </preConditions>
    <comment>drop name column</comment>
    <dropColumn tableName="roles" columnName="name"/>
</changeSet>

<changeSet id="0.1.1.4" author="Bob">
    <preConditions onFail="MARK_RAN">
        <tableExists tableName="roles"/>
        <columnExists tableName="roles" columnName="non_unique_name"/>
    </preConditions>
    <comment>rename non_unique_name column to name</comment>
    <renameColumn tableName="roles" oldColumnName="non_unique_name" newColumnName="name"
                  columnDataType="varchar(1024)"/>
</changeSet>

为了执行该要求:

不应将一个经销商分配给两个具有相同名称的角色。但 名称不同的角色可以包含相同的经销商。

您可以使用<addUniqueConstraint>更改,通过它可以添加复合唯一约束。 changeSet可能看起来像这样:

<changeSet id="0.1.1.5" author="Bob">
    <preConditions onFail="MARK_RAN">
        <tableExists tableName="roles"/>
        <columnExists tableName="roles" columnName="dealer"/>
        <columnExists tableName="roles" columnName="name"/>
    </preConditions>
    <comment>add unique constraint for roles.dealer and roles.name</comment>
    <addUniqueConstraint tableName="roles" columnNames="dealer, name"
                         constraintName="roles_dealer_name_unique" />
</changeSet>