在Postgres列中插入最大数值

时间:2018-12-25 10:30:28

标签: postgresql

假设我有一张类似的表

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上跟踪quantity的值超过9999999而不是该值insert / {{1} }列中包含update

当然,9999999可以是NUMERIC(10, 3)NUMERIC(10, 2)等,因此,最大值不要在查询文本中进行硬编码

在伪代码中,它类似于

NUMERIC(5, 2)

当然,在运行pgsql-query之前,我可以执行一些数据检查,但是目前这是我可以使用的最后一个解决方案。

1 个答案:

答案 0 :(得分:1)

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

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)

没有任何约束可以自动完成此操作。您都不能为此使用触发器,因为执行任何触发器之前都会检查数值溢出。