Liquibase: удаление дублирующейся строки - PullRequest
0 голосов
/ 08 мая 2018

Я пишу новый набор изменений, чтобы определить уникальный ключ в моей таблице, но, похоже, предыдущий набор изменений вставляет дублированные строки в мою таблицу (под дублированием я имею в виду две записи с одинаковым значением в целевом столбце моего нового). уникальное ограничение).

Из-за производственных ограничений я не могу изменить предыдущие наборы изменений.

Итак, перед добавлением ограничения я хочу удалить дублирующую строку.

Вот мой набор изменений:

{
    "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"
                }
            }
        ]
    }

Допустим, мои дублированные записи содержат имя «мое имя». Как видите, я удаляю все дублированные записи, затем мне нужно заново вставить свою уникальную запись.

Мне бы пришлось удалить только одну дублированную строку в моем операторе удаления, вместо того, чтобы удалить обе, а затем вставить снова. Но я не могу найти никакого решения, чтобы поставить условие where в row_number.

Кто-нибудь знает, как добавить к предложению where номер строки?

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 08 мая 2018

Если я вас правильно понял, вот вам xml changeSet. Извините, я никогда не использовал json для написания changeSets, но я думаю, что идея та же самая.

Этот набор изменений удалит все повторяющиеся записи в столбце 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.

...