如何防止 PostgreSQL 自动舍入数字类型?

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 本身对数据进行四舍五入以适合,而不是客户端显示。对于那些比这两个问题的标题看得更远的人来说,这将是显而易见的。

a_h*_*ame 6

我希望这是一个错误

您可以使用检查约束来验证值的比例,而不是数据类型的定义:

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)

会导致

ERROR: new row for relation "ttable" violates check constraint "check_tcol_scale"
   Detail: Failing row contains (123.45678)
Run Code Online (Sandbox Code Playgroud)

insert into ttable values (123.4567);
Run Code Online (Sandbox Code Playgroud)

将会成功。

查看此小提琴以查看此解决方案的实际效果。