oracle:安全地更改表中的值,如果不存在新条目,则删除旧条目

rqcrx0a6  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(194)

我有一张这样的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:如果一行不存在,如何插入

mwg9r5ms

mwg9r5ms1#

使用 EXISTS 子句以排除新更新记录的存在:

UPDATE yourTable t1
SET COL_2 = 'NewFoo'
WHERE
    COL_2 = 'Foo' AND
    NOT EXISTS (SELECT 1 FROM yourTable t2
                WHERE t2.COL_3 = t1.COL_3 AND t2.COL_1 = t1.COL_1 AND t2.COL_2 = 'NewFoo');
xjreopfe

xjreopfe2#

我找到了解决办法(蒂姆·比盖莱森的回答把我引向了正确的方向。)
这将工作,并保存运行多次

UPDATE table_name as t1
SET COL_2 = 'NewFoo'
WHERE
    COL_2 = 'Foo' AND
    NOT EXISTS (SELECT 1 FROM table_name as t2 WHERE t2.COL_1 = t1.COL_1 AND t2.COL_2 = 'NewFoo');

delete from table_name
WHERE COL_2 = 'Foo';

相关问题