2011-09-07 42 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的限制,所以你可能會想驗證整數你是傳遞您的查詢低於該值。

相關問題