我正在编写一个新的变更集以在我的表上定义一个唯一的密钥,但它似乎是一个先前的变更集在我的表中插入重复的行(通过重复,我的意思是在目标列上具有相同值的两个条目我新的独特约束。)
由于生产限制,我无法修改以前的更改集。
因此,在添加约束之前,我想删除重复的行。
这是我的变更集:
{
"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子句中?
感谢您的帮助。
答案 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
。