带有嵌套查询的PostgreSQL插入失败,并出现大量行

时间:2018-07-03 23:06:50

标签: postgresql

我正在尝试使用嵌套的SQL语句将数据插入PostgreSQL表中。我发现我的插入内容与嵌套查询返回的一小行(几千行)一起工作。例如,当我尝试:

insert into the_target_table (a_few_columns, average_metric)

    SELECT a_few_columns, AVG(a_metric)
    FROM a table
    GROUP BY a_few_columns LIMIT 5000)

但是,当我删除LIMIT时,同一查询失败(内部查询无限制返回大约30,000行):

  

错误:整数超出范围

a_metric是双精度,而a_few_columns是文本。我玩了LIMIT行,看来它可以插入而不会引发错误的行数是14,000。我不知道这是不确定的,还是在引发错误之前保持不变的阈值。

我已经浏览了关于该主题including this one的其他几篇SO帖子,并将表的主键数据类型更改为BIGINT。我仍然遇到相同的错误。我认为这不是数值溢出的问题,因为我要插入的插入量很小,甚至都没有接近阈值。

任何人都知道导致此错误的原因是什么

1 个答案:

答案 0 :(得分:0)

这里的问题是我想在表中插入avg_metric字段的定义不正确。我不小心将其定义为整数。通常这不是一个大问题,但是我也有一些无穷大(inf)。将字段数据类型切换为双精度后,就可以成功插入。当然,最好是在尝试插入之前,我的应用程序事先检查了有限值-通常,我会通过断言以编程方式进行此操作,但是对于嵌套查询,我不会费心检查。

我使用的最后一个查询是

插入the_target_table(a_few_columns,average_metric)

SELECT a_few_columns, CASE WHEN AVG(a_metric) = 'inf' THEN NULL ELSE AVG(a_metric) END
FROM a_table
GROUP BY a_few_columns LIMIT 5000)

一个更好的解决方案是首先检查a_table并替换所有inf值。