代码之家  ›  专栏  ›  技术社区  ›  u_mulder

在Postgres列中插入最大数值

  •  0
  • u_mulder  · 技术社区  · 6 年前

    假设我有一张像这样的桌子

    CREATE TABLE public.products
    (
        id       INTEGER NOT NULL
        article  CHARACTER VARYING(255)
        name     CHARACTER VARYING(255)
        quantity NUMERIC(10, 3)
    )
    

    如您所见,可以插入的最大值 quantity 领域是 9999999 9999999+1

    数值超出范围:7错误:数值字段溢出

    有没有办法追踪 INSERT / UPDATE 价值 超过 而不是这个值 insert / update 9999999 ?

    当然 NUMERIC(10, 3) 可以是 NUMERIC(10, 2) NUMERIC(5, 2) 不管怎样,最大值应该是 不能硬编码 在查询文本中。

    在伪代码中,它类似于

    UPDATE table SET quantity = IF value > 9999999 THEN 9999999 ELSE value;
    

    当然,我可以进行一些数据检查 之前

    1 回复  |  直到 6 年前
        1
  •  1
  •   klin    6 年前

    没有以所述方式限制数值的内置功能。您可以创建并使用函数来实现此行为:

    create or replace function limited_numeric(val numeric, prec int, scale int)
    returns numeric language sql immutable as $$
        select least(mx, val)
        from (
            select format('%s.%s', repeat('9', prec- scale), repeat('9', scale))::numeric as mx
        ) s
    $$;
    

    用法示例:

    insert into products 
    values (1, 'article 1', 'name 1', limited_numeric(12345678, 10, 3))
    returning *;
    
     id |  article  |  name  |  quantity   
    ----+-----------+--------+-------------
      1 | article 1 | name 1 | 9999999.999
    (1 row)