Postgresql 在Postgres列中插入最大数值

Postgresql 在Postgres列中插入最大数值,postgresql,Postgresql,假设我有一张像这样的桌子 CREATE TABLE public.products ( id INTEGER NOT NULL article CHARACTER VARYING(255) name CHARACTER VARYING(255) quantity NUMERIC(10, 3) ) 如您所见,可以插入数量字段的最大值为9999999。如果我尝试插入像9999999+1这样的值,我当然会收到 数值超出范围:7错误:数值字段溢出

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

CREATE TABLE public.products
(
    id       INTEGER NOT NULL
    article  CHARACTER VARYING(255)
    name     CHARACTER VARYING(255)
    quantity NUMERIC(10, 3)
)
如您所见,可以插入数量字段的最大值为9999999。如果我尝试插入像9999999+1这样的值,我当然会收到

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

是否有任何方法可以跟踪插入/更新数量值超过9999999的情况,而不是使用9999999替换该值插入/更新列

当然,NUMERIC10,3可以是NUMERIC10,2或NUMERIC5,2等等,所以最大值不应该在查询文本中硬编码

在伪代码中,它类似于

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

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

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

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)

自动完成这项任务没有任何约束。您也不能为此使用触发器,因为在执行任何触发器之前都会检查数值溢出。

这个问题绝对正确。它经常被怨恨的人否决。