首页 > 解决方案 > Liquibase:删除重复行

问题描述

我正在编写一个新的变更集以在我的表上定义一个唯一键,但它似乎以前的变更集在我的表中插入了重复的行(通过重复,我的意思是在我的新唯一约束的目标列上具有相同值的两个条目) .

由于生产限制,我无法修改以前的变更集。

所以,在添加我的约束之前,我想删除重复的行。

这是我的变更集:

{
    "changeSet": {
        "id": "123",
        "author": "me",
        "changes": [
            {
                "delete": {
                    "tableName": "foo",
                    "where": "name = 'myname'"
                }
            },
            {
                "insert": {
                    "tableName": "foo",
                    "columns": [
                        {
                            "column": {
                                "name": "id",
                                "valueSequenceNext" : "foo_seq"
                            }
                        },
                        {
                            "column": {
                                "name": "name",
                                "valueComputed": "myname"
                            }
                        }
                    ]
                }
            },
            {
                "addUniqueConstraint": {
                    "columnNames": "name",
                    "constraintName": "uk_fooname",
                    "tableName": "foo"
                }
            }
        ]
    }

假设我的重复条目名称为“myname”。如您所见,我正在删除所有重复的条目,然后我必须重新插入我唯一的条目。

我将不得不在我的删除语句中只删除一个重复的行,而不是删除两个然后再次插入。但是我找不到任何解决方案来在 row_number 上设置 where 条件。

任何人都知道如何将行号添加到 where 子句?

谢谢你的帮助。

标签: liquibase

解决方案


如果我理解正确,这就是xml changeSet它。对不起,我从来没有用过json写作changeSets,但我认为这个想法是一样的。

此 changeSet 将删除列中的所有重复条目,name只留下一个最低的条目id

<changeSet id="changeset-id" author="John Doe">
    <preConditions onFail="MARK_RAN">
        <columnExists tableName="foo" columnName="id"/>
        <columnExists tableName="foo" columnName="name"/>
    </preConditions>
    <sql>
        DELETE f1 FROM foo f1, foo f2
        WHERE f1.id > f2.id
        AND f1.name = f2.name;
    </sql>
</changeSet>

执行此操作后,changeSet您可以创建unique constraint.


推荐阅读