【发布时间】:2020-02-24 23:36:33
【问题描述】:
我需要使用约束来检查列值 (poids) 是否高于 0 并且在“。”之后不超过 3 个 digist。 (这是我可能/将要面临的考试题)
检查 poids 是否高于 0 很容易。
我有 google-it,人们说这在数据库端是不可能的,因为这需要像这样的格式输出来完成。
decimal(5,3) 将列限制为 3 位,但我们仍然可以输入 3 位以上的数字,这是我不想要的
这就是我目前所拥有的(只有“and”的右侧缺失,因为这是关于 3 位数限制的约束)
create table produit (
NP number(5),
poids decimal (5,3),
constraint PK_produit primary key (NP),
constraint ck_produit_poids check (poids >= 0 and )
);
【问题讨论】:
-
这个要求没有意义。如果将该列声明为
decimal(5,3),Oracle 会阻止存储超过 3 位的十进制精度。如果您担心来自客户端的值会被四舍五入,那么当任何约束/触发器开始发挥作用时,该四舍五入就已经发生了。因此,您实际上无法强制执行此操作。您可以做一些愚蠢的事情并将列声明为decimal (6,4),允许 4 个十进制数字,然后添加一个约束来检查是否存在非零的第 4 个十进制数字,但这过于复杂。 -
此外,它没有考虑到该值可能已四舍五入并最终为 0 的事实(即 1.23496 将四舍五入为 1.2350,这与 1.235 无法区分)。您可以通过将列声明为
decimal(7,5)或decimal(17, 15)来让这种情况变得越来越疯狂,但它仍然是可能的。
标签: sql oracle ddl check-constraints