【问题标题】:Liquibase: deleting duplicate rowLiquibase:删除重复行
【发布时间】:2018-05-08 20:46:24
【问题描述】:

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

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

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

这是我的变更集:

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


    【解决方案1】:

    如果我理解正确,这里是 xml changeSet。对不起,我从来没有用jsonchangeSets,但我认为这个想法是一样的。

    此更改集将删除列 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

    【讨论】:

      猜你喜欢
      • 2018-04-07
      • 1970-01-01
      • 2012-05-31
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      • 2010-10-07
      相关资源
      最近更新 更多