我正在尝试使用嵌套的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
。我仍然遇到相同的错误。我认为这不是数值溢出的问题,因为我要插入的插入量很小,甚至都没有接近阈值。
任何人都知道导致此错误的原因是什么
答案 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
值。