2011-09-07 39 views
11

我有一个表与下面的架构PostgreSQL的:如何解决“数字字段溢出”的问题

COLUMN_NAME, ORDINAL_POSITION,...., NUMERIC_PRECISION_INTEGER
"year";1;"";"YES";"numeric";;;17;10;17 "month_num";2;"";"YES";"numeric";;;17;10;17 "month_name";3;"";"YES";"text";;1073741824;;;
"week_of_month";4;"";"YES";"numeric";;;17;10;17
"count_of_contracts";5;"";"YES";"bigint";;;64;2;0

但是当我插入以下到它

insert into contract_fact values(2011, 8, 'Aug', 1, 367) 

我看到下面的错误

ERROR: numeric field overflow
SQL state: 22003
Detail: A field with precision 17, scale 17 must round to an absolute value less than 1.

+3

这不是一个模式,而是从一些内部postgres表转储。如果你能礼貌地产生一些可读的东西,比如\ d 的输出或者用来创建这个表的CREATE TABLE语句(pgAdmin3可以帮你这么做)?另外,声明为数字(X,Y)的字段最多可以使用X个位置,并且逗号分配Y小数点。也就是说,如果X = Y,则只能存储值<1. –

+2

另外,请在INSERT中包含列列表,这取决于任何特定的列顺序是一个坏主意。 –

回答

46

它看起来像你有你的yearweek_of_month列定义为numeric(17,17),这意味着17位数字,其中17位小数点后面。因此,该值必须介于0和1之间。您可能意思是numeric(17,0),或者您应该使用整数类型。

+10

+1,尽管混沌格式化很好 –

0

即使没有设置上限,我也有类似的问题。 如果您遇到这种情况,你可能想看看在全球PostgreSQL的极限位置:https://www.postgresql.org/docs/9.6/static/datatype-numeric.html

例如TIMESTAMP是一种BIGINT用的9223372036854775807的限制,所以你可能会想验证整数你是传递您的查询低于该值。

相关问题