删除唯一约束的重复项
Remove duplicates for unique constraint
我的数据库中有一辆汽车 table,列为 model_name
。
我需要在 model_name
列上添加唯一约束,但其中有很多重复值。
这就是为什么如果我尝试 <addUniqueConstraint>
,我的 changeSet
会失败。那么有没有办法在添加唯一约束之前删除所有重复项?
谢谢你的帮助。
根据 liquibase official documentation 开箱即用是不可能的。
您可以使用 <sql>
标签删除所有重复项,然后使用 <addUniqueConstraint>
.
例如:
<changeSet author="changeset-author" id="changeset-id">
<preConditions onFail="MARK_RAN">
<columnExists tableName="cars" columnName="model_name"/>
</preConditions>
<sql>
DELETE c1 FROM cars c1, cars c2 WHERE c1.id > c2.id AND c1.model_name = c2.model_name;
</sql>
<!--or as was suggested by @JavaDevSweden-->
<sql>
DELETE FROM cars WHERE id in (SELECT c1.id FROM cars c1, cars c2 WHERE c1.id > c2.id AND c1.model_name = c2.model_name);
</sql>
<addUniqueConstraint tableName="cars" columnNames="model_name" constraintName="cars_model_name_unique"/>
</changeSet>
我的数据库中有一辆汽车 table,列为 model_name
。
我需要在 model_name
列上添加唯一约束,但其中有很多重复值。
这就是为什么如果我尝试 <addUniqueConstraint>
,我的 changeSet
会失败。那么有没有办法在添加唯一约束之前删除所有重复项?
谢谢你的帮助。
根据 liquibase official documentation 开箱即用是不可能的。
您可以使用 <sql>
标签删除所有重复项,然后使用 <addUniqueConstraint>
.
例如:
<changeSet author="changeset-author" id="changeset-id">
<preConditions onFail="MARK_RAN">
<columnExists tableName="cars" columnName="model_name"/>
</preConditions>
<sql>
DELETE c1 FROM cars c1, cars c2 WHERE c1.id > c2.id AND c1.model_name = c2.model_name;
</sql>
<!--or as was suggested by @JavaDevSweden-->
<sql>
DELETE FROM cars WHERE id in (SELECT c1.id FROM cars c1, cars c2 WHERE c1.id > c2.id AND c1.model_name = c2.model_name);
</sql>
<addUniqueConstraint tableName="cars" columnNames="model_name" constraintName="cars_model_name_unique"/>
</changeSet>