插入数据:查看哪一列导致 Redshift 上的数字溢出

Posted

技术标签:

【中文标题】插入数据:查看哪一列导致 Redshift 上的数字溢出【英文标题】:Inserting data: see which column causes numeric overflow on Redshift 【发布时间】:2019-01-02 05:43:27 【问题描述】:

我有一个包含 ~1000 列的表,我试图将其插入到一个空表中。除标识符外,所有列都是数字。

我写了一个类似这样的创建表语句:

create table xx as (
  id varchar(10), 
  a numeric(9,4), 
  b numeric(9,4), 
  c numeric(5,4), 
  d numeric(5,4)
)

然后像这样插入

insert into xx select * from yy 

我收到一个错误:类似于“错误:XX000:数值数据溢出(结果精度)”。我想我需要提高其中一列的精度——但是哪一列呢?我怎么知道?如果有帮助,我正在使用 Aginity。

我的列太多,无法一一测试。空间也很重要,所以我不愿意增加所有列的精度。

【问题讨论】:

您使用的是复制命令吗?如果是这样,则将所有列(临时)更改为 varchar 然后运行一些 sql 来检查您的数据错误在哪里。如果可能的话,我建议你重新考虑你的桌子设计。 【参考方案1】:

我认为您必须逐一测试列——除非 Redshift 有一些我没有发现的日志记录机制。

您可以使用电子表格构建查询。即从列列表开始,然后生成查询,例如:

select min(a), max(a),
       min(b), max(b),
       . . .
from yy;

顺便说一句,您的问题很可能只是基于没有列名的insert。你可以先试试:

insert into xx (id, a, b, c, d, . . .)
    select id, a, b, c, d, . . .
    from yy ;

【讨论】:

以上是关于插入数据:查看哪一列导致 Redshift 上的数字溢出的主要内容,如果未能解决你的问题,请参考以下文章

amazon redshift 并发写入导致插入记录,导致重复

“无法识别数值''” - 哪一列?

在 Redshift 中将 null 插入整数类型列

redshift 卸载操作导致冗余数据

有没有办法在通过 Glue 插入 Redshift 时简单地截断列?

如何使用 redshift 上的函数插入表格