Java DB Error=ORA-01407:无法将(“XXX”值)更新为NULL。

Java DB Error=ORA-01407:无法将(“XXX”值)更新为NULL。,java,sql,database,oracle,Java,Sql,Database,Oracle,我有一个表'TAB',有两列'id'(数据库中的integer和notnull)和'value'(数据库中的varchar和notnull)。我使用java应用程序一次更新多行的“value”列(这是我的要求)。我使用了带有case和when关键字的update语句。查询是在运行时根据修改的行数生成的 如果同时更新所有行的数据,则查询工作正常,但如果更新的行数较少,则会出现错误。假设我们有三行id=1、2和3,分别为值A、B和C。 当同时为所有三行触发查询时,它就可以正常工作 UPDATE

我有一个表'TAB',有两列'id'(数据库中的integer和notnull)和'value'(数据库中的varchar和notnull)。我使用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 Error=ORA-01407:无法将(“XXX”“XXX”“VALUE”)更新为NULL

我知道这是因为“value”列在DB中不是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);

您正在更新表中的所有行。这是因为您没有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 )

你这样做很好

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 )

谢谢你的回复。我知道对于一行我可以使用where子句,但是可以有任意数量的行1、2或3。这取决于GUI用户操作。很抱歉,前面没有提到它。@vishalKumar如果要动态生成CASE语句,为什么不同时动态生成where子句呢?小心
SQL注入
攻击-始终处理用户输入。@vishalKumar我想您是在根据GUI中的用户选择动态创建
案例。同样,您也可以创建
where
子句。应该没什么大不了的。是的,我可以动态添加where子句,这不需要太多努力。谢谢你们给我宝贵的时间和答案。谢谢你们的回复。我知道对于一行我可以使用where子句,但是可以有任意数量的行1、2或3。这取决于GUI用户操作。很抱歉,前面没有提到它。@vishalKumar如果要动态生成CASE语句,为什么不同时动态生成where子句呢?小心
SQL注入
攻击-始终处理用户输入。@vishalKumar我想您是在根据GUI中的用户选择动态创建
案例。同样,您也可以创建
where
子句。应该没什么大不了的。是的,我可以动态添加where子句,这不需要太多努力。谢谢你们给我宝贵的时间和答案,非常感谢。我需要知道哪一个更好。如果你有任何想法,请分享。第一个版本并不完美。它处理所有记录,
CASE
语句为每个
id
返回
NULL
,而不是
1
。这意味着,如果存在
id 1
的任何记录,则
NOT NULL
约束将导致错误(正如操作人员所体验到的,它只是不正常…)@vishalKumar我建议使用
where
子句来筛选出可能会受到影响的行。@Dems第一条sql语句不会抛出任何异常(检查
ELSE
子句)。但即使这样,它也不可取,因为它将解析整个表
你这样做的方式非常好。
我希望你提到你添加了
其他的
(以及为什么),以防万一读者是个白痴(和我一样!);)谢谢。我需要知道哪一个更好。如果你有任何想法,请分享。第一个版本并不完美。它处理所有记录,
CASE
语句为每个
id
返回
NULL
,而不是
1
。这意味着,如果存在
id 1
的任何记录,则
NOT NULL
约束将导致错误(正如操作人员所体验到的,它只是不正常…)@vishalKumar我建议使用
where
子句来筛选出可能会受到影响的行。@Dems第一条sql语句不会抛出任何异常(检查
ELSE
子句)。但即使这样,它也不可取,因为它将解析整个表
你这样做的方式非常好。
我希望你提到你添加了
其他的
(以及为什么),以防万一读者是个白痴(和我一样!);)