我有一张这样的table
table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
th, td {
padding: 2px;
}
th {
text-align: left;
}
<table style="width:40%">
<tr>
<th>COL_1[PK]</th>
<th>COL_2[PK]</th>
<th>COL_3</th>
</tr>
<tr>
<td>A</td>
<td>Bar</td>
<td>4</td>
</tr>
<tr>
<td>B</td>
<td>Foo</td>
<td>8</td>
</tr>
<tr>
<td>C</td>
<td>Foo</td>
<td>15</td>
</tr>
<tr>
<td>C</td>
<td>NewFoo</td>
<td>15</td>
</tr>
<tr>
<td>D</td>
<td>Foo</td>
<td>16</td>
</tr>
<tr>
<td>E</td>
<td>Bar</td>
<td>23</td>
</tr>
<tr>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
</table>
我想更改所有行 COL_2 = 'Foo'
至 NewFoo
. 问题是有些行已经更改,而没有删除旧值。如果我执行命令
update TABLE
set COL_2 = 'NewFoo'
where COL_2 = 'Foo'
但是,当我尝试将第三行(c,foo,15)更改为(c,newfoo,15)时会遇到麻烦,因为该条目已经存在。
解决这个问题的一个方法是删除之前已经更改过的所有行,然后再次转换它们:
delete from TABLE where COL_2 = 'NewFoo';
update table
set COL_2 = 'NewFoo'
where COL_2 = 'Foo';
除非有人在同一个表上运行脚本两次,否则这将正常工作。第一次将删除所有旧的转换,并将所有“foo”值转换为“newfoo”(根据需要)。第二次执行脚本时,将删除所有转换的记录。
我正在寻找一种方法来做到这一点,而不必担心有人运行脚本两次。我认为解决方案看起来像这些例子中的某些东西,但我不知道如何形成这个陈述
oracle insert if not exists语句
oracle:如果一行不存在,如何插入
2条答案
按热度按时间mwg9r5ms1#
使用
EXISTS
子句以排除新更新记录的存在:xjreopfe2#
我找到了解决办法(蒂姆·比盖莱森的回答把我引向了正确的方向。)
这将工作,并保存运行多次