Liquibase:删除重复行

时间:2018-05-07 21:19:26

标签: 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子句中?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如果我理解正确的话,这里就是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