假设我有一张类似的表
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之前,我可以执行一些数据检查,但是目前这是我可以使用的最后一个解决方案。
答案 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)
没有任何约束可以自动完成此操作。您都不能为此使用触发器,因为执行任何触发器之前都会检查数值溢出。