我有(针对这个问题进行了简化)一个表“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
如果数据库中有多行,上述查询是否会影响任何性能问题。