2011-09-07 91 views
11

Tengo una tabla con el siguiente esquemaPostgreSQL: cómo resolver "desbordamiento de campo numérico" problema

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

pero cuando inserto el siguiente en él

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

veo el siguiente error

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

Esto no es un esquema sino un volcado de una tabla interna de postgres. Si pudiera tener la cortesía de producir algo legible, como el resultado de \ d o la sentencia CREATE TABLE que se utilizó para crear esta tabla (pgAdmin3 puede ayudarlo con esto)? Además, un campo declarado numérico (X, Y) puede usar hasta X lugares, con decimales Y correctos a la coma. Lo que significa que si X = Y solo puede almacenar valores <1. –

+2

Además, incluya la lista de columnas en sus INSERT, dependiendo de cualquier orden de columna en particular, es una mala idea. –

Respuesta

46

Parece que tiene sus columnas year y week_of_month definidas como numeric(17,17), lo que significa 17 dígitos, 17 de los cuales están detrás del punto decimal. Entonces, el valor debe estar entre 0 y 1. Probablemente se refería al numeric(17,0), o tal vez debería usar un tipo de entero.

+10

+1, buena captura a pesar del formato caótico –

0

Tuve un problema similar incluso sin haber establecido un límite superior. Si esto le sucede, es posible que desee ver en los límites de PostgreSQL globales aquí: https://www.postgresql.org/docs/9.6/static/datatype-numeric.html

Por ejemplo TIMESTAMP son una especie de BIGINT con un límite de 9223372036854775807 así que sería bueno para validar que el número entero a su pasen en su consulta está por debajo de ese valor.

Cuestiones relacionadas