1

我有(针对这个问题进行了简化)一个表“TAB”,其中包含两列“id”(整数而不是 db 中的空值)和“值”(varchar,而不是 db 中的空值)。我正在使用Java应用程序一次更新多行的“值”列(这是我的要求)。我使用了带有 case 和 when 关键字的 update 语句。查询是在运行时根据修改的行数生成的。

如果为所有行一起更新数据,则查询工作正常,但在更新较少行时它会给我错误。假设我们有 id = 1、2 和 3 的三行,其值分别为 A、B 和 C。
当对所有三行一起触发查询时,它可以正常工作

UPDATE 
     TAB set value = CASE 
       WHEN id = 1 THEN 'X' WHEN id = 2 THEN 'Y' WHEN id = 3 THEN 'Z' 
END

但是,当查询被触发少于三行时,我遇到了数据库错误。

UPDATE TAB set value = CASE WHEN id = 1 THEN 'X' END

导致以下错误:

DB 错误=ORA-01407:无法将 ("XXX"."XXX"."VALUE") 更新为 NULL。

我知道发生这种情况是因为 DB 中的“值”列不为空。我想知道上面的查询是否试图用 NULL 更新所有剩余的值?

如果我添加如下所示的 ELSE 部分,查询工作正常。

UPDATE TAB set value = CASE WHEN id = 1 THEN 'X' ELSE TAB.value END

如果数据库中有多行,上述查询是否会影响任何性能问题。

4

2 回答 2

4

您正在更新表中的所有行。这是因为您没有where子句。

要更新一行,请添加 where 子句。

UPDATE TAB set value = CASE WHEN id = 1 THEN 'X' END where id = 1;

或者在您的 3 行案例中,

UPDATE TAB set value = CASE WHEN id = 1 THEN 'X' WHEN id = 2 THEN 'Y'
WHEN id = 3 THEN 'Z' END where id in ( 1,2,3);
于 2012-05-22T06:06:20.347 回答
2

你这样做的方式非常好。

UPDATE TAB set value = CASE WHEN id = 1 THEN 'X' ELSE TAB.value END

其他解决方案可能是使用where子句

UPDATE TAB set value = CASE WHEN id = 1 THEN 'X' when ID = 2 then 'Y' END where id in ( 1, 2 )
于 2012-05-22T06:07:22.857 回答