![](/img/trans.png)
[英]Deletions with Spring data/Hibernate: ORA-01407: Cannot update to 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.