Liquibase:删除重复行

Liquibase: deleting duplicate row

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

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

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

这是我的变更集:

{
    "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 子句中添加行号吗?

感谢您的帮助。

如果我没理解错的话,这里是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.