2011-09-07 13 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

यह एक स्कीमा नहीं है लेकिन कुछ आंतरिक पोस्टग्रेस तालिका से डंप है। यदि आप कुछ पठनीय उत्पादन करने के लिए सौजन्य कर सकते हैं, जैसे \ d से आउटपुट या CREATE तालिका कथन जो इस तालिका को बनाने के लिए उपयोग किया गया था (pgAdmin3 इस के साथ आपकी सहायता कर सकता है)? इसके अलावा, एक क्षेत्र घोषित संख्यात्मक (एक्स, वाई) एक्स स्थानों तक उपयोग कर सकता है, वाई decimals अल्पविराम के अधिकार के साथ। जिसका अर्थ है कि यदि एक्स = वाई आप केवल मूल्यों को स्टोर कर सकते हैं <1. –

+2

इसके अलावा, कृपया किसी भी विशेष कॉलम ऑर्डर के आधार पर, अपने INSERT में कॉलम सूची शामिल करें, एक बुरा विचार है। –

उत्तर

46

ऐसा लगता है कि आपके year और week_of_month कॉलम 0,123,679 के रूप में परिभाषित किया गया है, जिसका अर्थ 17 अंक है, जिनमें से 17 दशमलव बिंदु के पीछे हैं। तो मान 0 और 1 के बीच होना चाहिए। शायद आप numeric(17,0) का मतलब है, या शायद आपको एक पूर्णांक प्रकार का उपयोग करना चाहिए।

+10

+1, अराजक स्वरूपण के बावजूद अच्छा पकड़ –

0

मुझे ऊपरी सीमा निर्धारित किए बिना भी एक ही समस्या थी। आपके साथ ऐसा होता है, तो आप वैश्विक PostgreSQL सीमा यहाँ को देखने के लिए चाहते हो सकता है: https://www.postgresql.org/docs/9.6/static/datatype-numeric.html

उदाहरण टाइमस्टैंप के लिए 9223372036854775807 की एक सीमा के साथ BIGINT का एक प्रकार है, ताकि आप को मान्य करने के लिए कि पूर्णांक अपने में से गुजर रहे हैं चाहते हो सकता है आपकी क्वेरी उस मान से नीचे है।

संबंधित मुद्दे