H2,MySQL-唯一约束字段也是外键时的liquibase dropUniqueConstraint问题

时间:2019-01-16 16:38:01

标签: mysql h2 liquibase unique-constraint

根据liquibase documentation,几乎每个数据库都支持 dropUniqueConstraint

我使用 h2 (和 mysql )并定义了如下唯一约束

<changeSet id="someId">
    <addUniqueConstraint tableName="some_table"
                         columnNames="some_foreigh_key_id, another_foreign_key_id"
                         constraintName="constraint_name"/>
 </changeSet>

以下changeSet似乎没有效果。更具体地说,它的确执行而没有返回任何错误,但是在测试时,我仍然有一个唯一的违反约束的异常。

<changeSet id="someId-a">
     <dropUniqueConstraint tableName="some_table"
                          columnNames="some_foreigh_key_id, another_foreign_key_id"
                          constraintName="constraint_name" />
  </changeSet>

奇怪的是,它可用于其他数据库(使用 postgres 测试)

我错过了什么吗?

更新

注意:似乎唯一约束确实被删除了,但它所使用的索引没有被删除。更具体地说:

   SELECT* FROM information_schema.constraints 
           WHERE table_name='some_table' AND constraint_type='UNIQUE';

不返回任何结果,

 SELECT index_name, column_name
    FROM information_schema.indexes 
    WHERE index_name LIKE 'constraint_name%';

返回

INDEX_NAME              | INDEX_COLUMN
CONSTRAINT_NAME_INDEX_3 | some_foreigh_key_id
CONSTRAINT_NAME_INDEX_3 | another_foreign_key_id

现在,如果我尝试手动删除该索引,则会出现以下错误:

DROP INDEX CONSTRAINT_NAME_INDEX_3;
[90085][90085] Index "CONSTRAINT_NAME_INDEX_3" belongs to constraint  "some_foreigh_key_id"
               Index "CONSTRAINT_NAME_INDEX_3" belongs to constraint "another_foreign_key_id";
SQL statement: drop index CONSTRAINT_NAME_INDEX_3    [90085-196]

一种解决方法是仅对H2执行以下变更集:

  1. 删除外键(dropForeignKey)
  2. 执行dropUniqueConstraint脚本和
  3. 重新添加外键(addForeignKey)

还有其他方法吗? 有人在另一个数据库系统上经历过类似的经历吗?

更新2

似乎该问题也可以通过 mySQL 重现

0 个答案:

没有答案