繁体   English   中英

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

[英]DB Error=ORA-01407: cannot update (“XXX”.“XXX”.“VALUE”) to NULL.

我有一个表“ TAB”(已简化此问题),其中有两列“ id”(整数,在db中不为null)和“值”(varchar,在db中不为null)。 我正在使用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。

我知道这是因为数据库中的“值”列不为空。 我想知道上面的查询是否试图用NULL更新所有剩余的值?

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

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

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

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

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

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

或者在三排的情况下

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);

您执行此操作的方式非常好。

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 )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM