[英]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.