【问题标题】:Getting error in Oracle "ORA-01400: cannot insert NULL into..." when there are no NULL values当没有 NULL 值时,Oracle 中出现错误“ORA-01400: cannot insert NULL into ...”
【发布时间】:2019-10-04 13:53:38
【问题描述】:

我目前正在尝试在 Oracle SQL 上执行以下代码:

INSERT INTO author (totalrevenue)

SELECT NVL (margin, 0)
FROM (SELECT a.author_Fname, a.author_lname, SUM (b.totalmargin) as margin 
FROM author a LEFT JOIN bookauthor ba ON a.author_id = ba.ba_authorid
LEFT JOIN book b ON ba.ba_isbn = b.book_isbn
GROUP BY a.author_fname, a.author_lname);

SELECT 查询返回一列 14 个非空值,通过使用 NVL 实现。

但是,当我一起执行INSERT 查询时,我仍然得到:“ORA-01400: cannot insert NULL into ("IT337052"."AUTHOR"."AUTHOR_ID")" 错误使用 SELECT 查询。

有什么想法吗?

【问题讨论】:

  • 但是您没有为 AUTHOR_ID 列提供任何值...
  • 你应该做UPDATE,而不是INSERT,因为作者已经存在于表中!

标签: php sql oracle datatable insert


【解决方案1】:

您似乎在数据插入中错过了 AUTHOR_ID

INSERT INTO author (AUTHOR_ID,totalrevenue)

SELECT AUTHOR_ID,NVL (margin, 0)
FROM (SELECT a.AUTHOR_ID , SUM (b.totalmargin) as margin 
FROM author a LEFT JOIN bookauthor ba ON a.author_id = ba.ba_authorid
LEFT JOIN book b ON ba.ba_isbn = b.book_isbn
GROUP BY a.AUTHOR_ID);

【讨论】:

  • 在这种情况下,您不需要按 a.author_fname、a.author_lname 进行分组,因为您使用的 AUTHOR_ID 似乎是主键。查询真的很奇怪,因为它试图插入作者的总收入而不是更新
  • @SergeyM 这不是 mysql 它是 oracle
  • 如果我们一般谈论 SQL 有什么区别。您根本不需要 a.author_Fname、a.author_lname。它不在任何地方使用,并且 AUTHOR_ID 将在更精细的级别上进行分组,然后是其他无用的列
  • @SergeyM 做一些研发兄弟你会找到剩下的
  • 我想你没有明白我的意思。我的意思是你不需要 group by 和 select 中的 a.author_fname、a.author_lname 列。如果您按 a.AUTHOR_ID 进行分组逻辑,那么只有 a.AUTHOR_ID 应该在带有聚合的选择列表中。 a.author_fname, a.author_lname 在此查询中变得无用。我不是 mysql 专家,这就是为什么我对它的扩展组一无所知。我说的是sql标准
【解决方案2】:

这需要是一个 UPDATE(或 MERGE)语句。我怀疑您最初尝试更新语句失败了,因为您没有将子查询与您正在更新的表相关联。

我认为你追求的是这样的:

UPDATE author a
SET    totalrevenue = (SELECT SUM(b.totalmargin) AS margin
                       FROM   bookauthor ba
                              LEFT JOIN book b ON ba.ba_isbn = b.book_isbn
                       WHERE  a.authorid = ba.ba_authorid)
WHERE  totalrevenue != (SELECT SUM(b.totalmargin) AS margin
                        FROM   bookauthor ba
                               LEFT JOIN book b ON ba.ba_isbn = b.book_isbn
                        WHERE  a.authorid = ba.ba_authorid);

我添加了 where 子句以避免更新已经具有正确值的行。您可以排除它,但如果您这样做了,这意味着作者表中的每一行都会更新,即使该值已经正确 - 即可能完成的工作超出了必要的范围。但是,如果您已经创建了该列并且需要第一次填充它,则不需要 where 子句,因为无论如何您都需要更新每一行。

【讨论】:

  • 您好,感谢您的评论。但我收到此错误:“SQL 错误:ORA-00938:函数参数不足”...您的 SELECT 查询返回正确的表,所以不知道发生了什么
  • 糟糕,抱歉;你只需要完全删除合并。我忘了把第二个参数设置为 0,但是如果值为 null,无论如何它都不会被总和拾取。我已经更新了我的答案。
  • 已解决。非常感谢:)
【解决方案3】:

我的一个想法是,您尝试在 Author 表中插入新值,该表的主键 AUTHOR_ID 不能为空,并且默认情况下不会自动递增。您必须明确提供主键值

我很感兴趣,当您的计算基于现有值并且您想计算现有作者的总数时,您为什么要尝试插入新值。 流量有问题。 您应该使用 UPDATE 或 INSERT 到一些带有总计的新表中。但与您在选择中使用的不同

【讨论】:

  • 您好,感谢您的想法,您指出这一点是对的。我最初尝试使用 UPDATE,因为我打算做的只是将 author.totalrevenue 中的值替换为通过执行三个不同表的 INNER JOIN 和 GROUP BY 获得的 NVL (margin,0) 值。它没有用,我得到“ORA-01427:单行子查询返回多于一行”错误......即使值的数量完全相同..
猜你喜欢
  • 1970-01-01
  • 2011-12-07
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
  • 2016-06-21
  • 2019-12-31
  • 2011-08-23
相关资源
最近更新 更多