liquibase - 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 子句?
谢谢你的帮助。
解决方案
如果我理解正确,这就是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
.
推荐阅读
- typescript - 当我在角度 6 中动态单击添加行时,如何获取以前的数据?
- html - ng-show 在页面加载时可见
- mongodb - 如何在文档中搜索任何值
- amazon-web-services - 仅暂时禁用 Auto-Scaling Group 的 Scale-Down
- emacs - 使用 Emacs 的组织模式:我必须将导出放在哪里才能在 Emacs 守护程序中使用它?
- ios - 如何使表格视图单元格展开和折叠
- rest - 使用outlook rest api对邮件/联系人/日历进行批量请求
- continuous-integration - Go-CD - 当 JUNIT 或 JASMINE 或回归测试在 Go-CD 中失败时如何停止生成工件
- javascript - 如何从包含在 formData() 中的数组中删除元素
- python - 如何在python中创建带阻滤波器