Liquibase:如何删除没有约束名称的唯一约束?

时间:2014-07-21 18:53:10

标签: java liquibase

这就是我的专栏

        <column name="name" type="VARCHAR(255)">
            <constraints nullable="false" unique="true"/>
        </column>

我想删除unique=true约束。

我查看了liquibase提供的内容,并且

<changeSet author="liquibase-docs" id="dropUniqueConstraint-example">
    <dropUniqueConstraint catalogName="cat"
            constraintName="const_name"
            schemaName="public"
            tableName="person"
            uniqueColumns="A String"/>
</changeSet>

既然constraintName是必需的,我没有,我有什么选择?

如何使用liquibase删除unique=true

8 个答案:

答案 0 :(得分:3)

您可以像这样执行SQL,但它可能不适用于所有数据库:

<sql>alter table Person drop unique (name)</sql>

如果该列上有明确创建的索引,您可能也希望删除它:

<sql>alter table Person drop unique (name) drop index</sql>

这适用于Oracle,其他数据库可能有不同的语法。

答案 1 :(得分:2)

我最终创建了一个新列来替换具有唯一约束的列。

<addColumn tableName="TABLE" schemaName="SCHEMA">
<column name="NEW_COLUMN" type="TYPE" valueComputed="OLD_COLUMN"></column>
</addColumn>

<dropColumn tableName="TABLE" schemaName="SCHEMA" columnName="OLD_COLUMN"/>

<renameColumn tableName="TABLE" schemaName="SCHEMA" oldColumnName="NEW_COLUMN" newColumnName="OLD_COLUMN"/>

答案 2 :(得分:1)

如果您使用postgresql,则可以在pgAdmin中找到所需的constraintName。选择你的列,然后转到右边的第四个标签(我相信它会被称为“依赖项”,或类似的东西)

enter image description here

正如您所看到的,在我的情况下,constraintName是“public.external_message_storage_message_external_uuid_key”然后只做

  ngAfterContentInit(): void {
    // This does not work
    let value = this.vs.nativeElement.nextSibling.nodeValue as string;
  }

答案 3 :(得分:0)

常见的方法是:

  1. 创建新列
  2. 将数据迁移到新列(更新)
  3. 删除旧列

    <changeSet id="20170711-001" author="yourName">
        <addColumn tableName="tableName">
            <column name="name2" type="VARCHAR(255)">
                <constraints nullable="false" unique="false" />
            </column>
        </addColumn>
    </changeSet>
    <changeSet author="yourName" id="20170711-002">
        <update tableName="tableName">
          <column name="name2" type="varchar(255)" valueComputed="originalColumn"/>
        </update>
    </changeSet>
    <changeSet author="yourName" id="20170711-003">
        <dropColumn columnName="originalColumn" tableName="tableName"/>
    </changeSet>
    
  4. 如果要像旧原始列一样重命名新列,只需通过更改列的名称重复这些步骤。

答案 4 :(得分:0)

这是一个古老的问题,但是。当我使用列名称作为约束名称时,对我来说有效: (MySQL)

<changeSet id="remove_unique_column_constraint" author="author">
        <dropUniqueConstraint schemaName="xxx"
                              tableName="xxx"
                              constraintName="column_name"/>
        <rollback>
               <addUniqueConstraint schemaName="xxx"
                             tableName="xxx"
                             columnNames="some_id"
                             constraintName="constraint_name"/>
         </rollback>
</changeSet>

在回滚中,您可以设置以前的约束名称或新的约束名称。但是,如果在回滚中将设置新的constraintName,则应进行回滚并在dropUniqueConstraint命令中设置此名称。

答案 5 :(得分:0)

在liquibase中,dropUniqueConstraint对于某些类似postgres 9.6.6 aurora的数据库存在问题,因此对于丢弃唯一约束,请使用以下命令:

- changeSet:
    id: dropunique_constraints
    author: ankitaggarwal
    changes:
    - dropForeignKeyConstraint:
        baseTableName: member_account
        constraintName: composite_unique_member_account

- changeSet:
    id: dropunique_constraints
    author: ankitaggarwal
    changes:
    - sql:
       sql: "ALTER TABLE member_account DROP CONSTRAINT composite_unique_member_account"

答案 6 :(得分:0)

我使用以下代码解决这个问题:

<changeSet id="202112050129-1" author="ousama">
    <sql>
        Declare @Cons_Name NVARCHAR(100)
        Declare @Str NVARCHAR(500)
        SELECT @Cons_Name=name FROM sys.objects WHERE type='UQ' AND OBJECT_NAME(parent_object_id) = N'tableName'
        SET @Str='ALTER TABLE tableName DROP CONSTRAINT ' + @Cons_Name
        Exec (@Str)
    </sql>
</changeSet>

希望对您有所帮助

答案 7 :(得分:-2)

我认为您最好的办法是查询您的信息架构数据库以查找名称,然后使用它来删除它并使用ChangeLog

这对我有用:

SELECT `CONSTRAINT_NAME`
FROM  `TABLE_CONSTRAINTS` 
WHERE  `CONSTRAINT_TYPE` LIKE  'UNIQUE'

当然,这会返回数据库中的每个唯一约束名称,但您应该能够从那里缩小搜索范围。