ORACLE:更新多列错误:无法将字符串更新为NULL

时间:2013-02-23 09:39:17

标签: oracle sql-update runtime-error multiple-columns

我有一个简单的更新版本:

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给我多个条目。并且在这种情况下,merge语句可能会失败,并且错误无法获得稳定的行集。如果有任何其他更好的appraoch让我知道。

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

2 个答案:

答案 0 :(得分: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被定义为非null,则所有x,y或z列都应该没有空值(如果t1.a不为null,则所有x都不应为null)

答案 1 :(得分:0)

我找到了我收到错误的原因。条件t2.name = t1.name我在表table_1中得到两行。对于第一行,我从内部选择查询得到值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
)

希望它能帮助别人。