簡體   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