PostgreSQL:如何解决“数值字段溢出”问题

39

我有一个具有以下模式的表格:

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)  

我看到以下错误

错误:数字字段溢出
SQL状态:22003
详细信息:精度为17,比例为17的字段必须舍入为绝对值小于1的值。


3
这不是模式,而是一些内部postgres表的转储。如果您能有礼貌地提供可读性更强的内容,例如 \d <tablename> 的输出或用于创建此表的CREATE TABLE语句(pgAdmin3可以帮助您完成此操作),那将非常感激。另外,一个声明为numeric(X,Y)的字段最多可以使用X位,小数点右边有Y位。这意味着如果X=Y,则只能存储小于1的值。 - Nordic Mainframe
2
此外,在您的INSERT中包含列列表是一个好习惯,依赖于任何特定的列顺序都是不好的做法。 - mu is too short
2个回答

86

看起来你的yearweek_of_month列被定义为numeric(17,17),意味着17个数字,其中有17个在小数点后面。因此该值必须介于0和1之间。你可能想要用numeric(17,0),或者也许你应该使用整数类型。


我知道你是正确的,但我实在无法理解。为什么小数点前后17位的约束会导致可能值范围为[0,1]呢? - edward_wong
1
对于那些像我一样有点困惑的人来说,精度是指数字的总位数;刻度是指小数点后的位数。如果你得到了 number(17, 17) - 你可以这样说:该数字将作为一个整体存储17个数字,并保留17个数字用于小数点。范围为[0,1]。 - edward_wong

1
我甚至没有设置上限也遇到了类似的问题。如果您遇到此问题,您可能需要查看全局PostgreSQL限制,可以在这里找到:https://www.postgresql.org/docs/9.6/static/datatype-numeric.html 例如,TIMESTAMP是一种带有上限为9223372036854775807的BIGINT类型,因此您可能需要验证您在查询中传递的整数是否低于该值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接