【问题标题】:ORACLE : Update multiple columns error : Can not update string to NULLORACLE:更新多列错误:无法将字符串更新为 NULL
【发布时间】:2013-02-23 20:28:59
【问题描述】:

我有一个简单的更新声明:

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。

【问题讨论】:

  • 您的列很可能有一个非空约束...
  • 这个 1=1 让我恶心
  • 对不起 MUG4N,这只是为了测试。我没有将它保留在我的最终代码中。 @Ben:我更新了我的查询。
  • MUG4N, WHERE 1=1 在调试时很有用,因为它允许您注释/注释掉所有限制以观察不同的结果。如果注释掉 WHERE 关键字,则必须将第一个条件从 AND 重写为 WHERE,这很烦人,而且需要更长的时间。

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


【解决方案1】:

问题可能是您在 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 被定义为非空值,则所有 x、y 或 z 列都不应为空值(如果 t1.a 不为空等,则所有 x 不应为空值)

【讨论】:

    【解决方案2】:

    我找到了出现该错误的原因。在条件 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
    )
    

    希望它能帮助其他人。

    【讨论】:

      猜你喜欢
      • 2012-07-16
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 2021-01-08
      • 2018-11-27
      • 1970-01-01
      相关资源
      最近更新 更多