【问题标题】:How to restrict to 3 digits a decimal number as a constraint check (SQL)如何将十进制数限制为 3 位作为约束检查(SQL)
【发布时间】: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


【解决方案1】:

这是你想要的吗?

 constraint ck_produit_poids check 
     (poids 
  >= 0 and
  length(Substr(poids,INSTR(poids, '.' )+1,
    length(poids) )<=3

【讨论】:

  • 是的,它工作了我的最终查询是约束 ck_produit_poids 检查 (poids >= 0 和长度(Substr(poids,INSTR(poids, '.') + 1, length(poids)))
  • 太棒了……如果有帮助的话
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
  • 1970-01-01
相关资源
最近更新 更多