DB错误= ORA-01407:无法更新(“XXX”。“XXX”。“VALUE”)为NULL。

时间:2012-05-22 06:01:38

标签: java sql database oracle

我(已经简化了这个问题)一个表'TAB',其中两列'id'(db中的整数而不是null)和'value'(db中的varchar而不是null)。我正在使用java应用程序一次更新多行的'value'列(这是我的要求)。我用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

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

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

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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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 )