2013-02-23 146 views
0

我有一个简单的更新stament为:ORACLE:更新多列错误:无法更新字符串为NULL

UPDATE table_1 t1 SET (t1.a, t1.b, t1.c) = 
(SELECT t2.x, t2.y, t3.z 
    FROM table_2 t2, table_3 t3, table_4 t4 
    WHERE 
    1 = 1 
    AND t2.id = t3.id 
    AND t2.id1 = t4.id1 
    AND t2.name = t1.name 
) WHERE EXISTS 
(SELECT 1 FROM t2 
WHERE 
1 = 1 
AND t2.name = t1.name 
) 

内SELECT查询给我的结果。但是,当我执行整个UPDATE查询时,它失败,错误: ORA-01407“无法更新(%s)为NULL” 它也说t1.a更新为NULL不可能。请让我知道,如果我在这个更新查询中有任何错误。

请注意,我不能使用MERGE语句,因为有可能t2.name = t1.name条件可能会从表t2中给我多个条目。在这种情况下,合并语句可能会失败,错误无法获得稳定的行集。如果还有其他更好的方法让我知道。

更新:t1.a具有NOT NULL约束。而我的内部查询返回的结果没有t2.x作为NULL。

+0

你的列最有可能有一个非空约束... – Ben 2013-02-23 09:42:04

+0

这里1 = 1让我生病 – MUG4N 2013-02-23 09:43:40

+0

对不起MUG4N,这只是为了测试。我不把它保留在我的最终代码中。 @Ben:我更新了我的查询。 – user613114 2013-02-23 09:49:52

回答

0

问题可能是SET部分中的SQL比EXITS中的SQL更具选择性。如果是这样,请将您的存在更改为
... EXISTS (SELECT 1 from
FROM table_2 t2, table_3 t3, table_4 t4
WHERE
t2.id = t3.id
AND t2.id1 = t4.id1
AND t2.name = t1.name


如果您将a,b,c定义为非空(如果t1.a所有x都不为null,那么您所有的x,y或z列都不应该为空值是不是空等)

0

我发现我之所以得到该错误的原因。条件t2.name = t1.name我在表table_1中得到了两行。对于第一行,我从内部select查询中获得了值t2.x。对于第二排我没有。因此我得到了错误。我修改我的查询如下:

UPDATE table_1 t1 SET (t1.a, t1.b, t1.c) = 
(SELECT t2.x, t2.y, t3.z 
    FROM table_2 t2, table_3 t3, table_4 t4 
    WHERE 
    1 = 1 
    AND t2.id = t3.id 
    AND t2.id1 = t4.id1 
    AND t2.name = t1.name 
) WHERE t1.id, t1.name IN 
(SELECT t1.id, t1.name FROM table_2 t2, table_3 t3, table_4 t4 
    WHERE 
    1 = 1 
    AND t2.id = t3.id 
    AND t2.id1 = t4.id1 
    AND t2.name = t1.name 
) 

希望它会帮助别人。