根据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执行以下变更集:
还有其他方法吗? 有人在另一个数据库系统上经历过类似的经历吗?
似乎该问题也可以通过 mySQL 重现