Tec*_*Sam 0 postgresql decimal
我有一个简单的架构和 MWE 查询。
架构:
CREATE TABLE ttable (
tcol Numeric(19,4)
)
Run Code Online (Sandbox Code Playgroud)
询问:
INSERT INTO ttable (tcol) VALUES ('123.45678');
SELECT * FROM ttable;
Run Code Online (Sandbox Code Playgroud)
结果:
123.4568
在这种情况下,我失去了精度。我输入了五位小数,但 Postgres 自动四舍五入。我希望这是一个错误,或者至少是我可以检测到的某种警告,以便我可以告诉用户精度损失。
我怎样才能做到这一点?
编辑:
这个问题显然不是这个问题的重复。在那个问题中,用户正在使用一个客户端应用程序,该应用程序对低于存储精度的值进行四舍五入。我的问题是关于 Postgres 本身对数据进行四舍五入以适合,而不是客户端显示。对于那些比这两个问题的标题看得更远的人来说,这将是显而易见的。
我希望这是一个错误
您可以使用检查约束来验证值的比例,而不是数据类型的定义:
CREATE TABLE ttable
(
tcol numeric,
constraint check_tcol_scale check (scale(tcol) <= 4)
);
Run Code Online (Sandbox Code Playgroud)
另请注意,列本身需要重新定义为 just numeric
,而不是numeric(19,4)
。
然后如下:
insert into ttable values (123.45678);
Run Code Online (Sandbox Code Playgroud)
会导致
Run Code Online (Sandbox Code Playgroud)ERROR: new row for relation "ttable" violates check constraint "check_tcol_scale" Detail: Failing row contains (123.45678)
但
insert into ttable values (123.4567);
Run Code Online (Sandbox Code Playgroud)
将会成功。
查看此小提琴以查看此解决方案的实际效果。
归档时间: |
|
查看次数: |
699 次 |
最近记录: |