【问题标题】:How to set precision and scale in ALTER TABLE如何在 ALTER TABLE 中设置精度和比例
【发布时间】:2014-05-28 05:25:37
【问题描述】:

我有 PostgreSQL 9.3 的工作代码:

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

但不知道如何设置precisionscale

【问题讨论】:

    标签: postgresql types precision ddl arbitrary-precision


    【解决方案1】:

    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,你不知道。

    【讨论】:

    • 感谢它的工作.. ALTER TABLEmeter_data ALTER COLUMN w3pht TYPE numeric USING (w3pht::numeric(15, 2));
    • 不,该代码具体不起作用。列类型设置为无限制精度,但所有现有值都四舍五入到小数点后 2 位。
    【解决方案2】:

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

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

    如果要存储的值的比例大于声明的 列的刻度,系统会将值四舍五入到指定的值 小数位数。那么,如果左边的位数 小数点超过声明的精度减去声明的 规模,引发错误。

    因此您的更改表可能是:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 2012-11-18
      • 2015-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      相关资源
      最近更新 更多