如何在ALTER TABLE中设置精度和比例

时间:2014-05-28 05:25:38

标签: postgresql types precision ddl arbitrary-precision

我使用PostgreSQL 9.3编写代码:

ALTER TABLE meter_data ALTER COLUMN w3pht TYPE float USING (w3pht::float);

但不知道如何设置精度比例

2 个答案:

答案 0 :(得分:4)

类型float没有精度和比例。如果您需要,请使用numeric(precision, scale)

Per documentation:

  

数据类型realdouble precision是不精确的,可变精度的数字类型。

对于您的例子:

ALTER TABLE meter_data ALTER COLUMN w3pht TYPE numeric(15,2)
USING w3pht::numeric(15,2)  -- may or may not be required

手册:

  

如果没有从旧类型到新类型的隐式或赋值转换,则必须提供USING子句。

示例:如果旧数据类型为text,则需要USING子句。如果是float,则不会。

答案 1 :(得分:1)

根据PostgreSQL documentation,您可以使用语法float(n)选择浮点数的最小数量,其中n的最小数量二进制数字,最多53个。

但是,要存储十进制值,请使用numeric(precision, scale)或其同义词decimal(precision, scale),但请注意这些是硬限制;根据文件:

  

如果要存储的值的比例大于声明的值   列的比例,系统会将值舍入到指定的值   小数位数。然后,如果左边的位数   小数点超过声明的精度减去声明的精度   比例,提出错误。

因此你的alter table可能是:

ALTER TABLE meter_data
    ALTER COLUMN w3pht TYPE numeric(10, 2)
    USING (w3pht::numeric(10, 2));

小数点右边的2位数和10位数。但是,如果你不这样做 需要指定限制,简单numeric将允许“小数点前最多131072位;”后最多16383位。