【问题标题】:Restricting the exact number of numbers input in a field Oracle SQL Developer限制字段​​中输入数字的确切数量 Oracle SQL Developer
【发布时间】:2020-04-29 14:06:55
【问题描述】:

我正在尝试为电话号码创建一个字段,该字段不需要更多,不少于 10 个号码。我试过了 电话号码(10) CHECK (Telephone=10) 但它不起作用,也不能将其作为约束添加到属性之后。

【问题讨论】:

  • CHECK (LENGTH(Telephone) = 10)
  • 它说 LEN 是一个无效的标识符
  • 对不起LENGTH 甲骨文。
  • 它给了我这个:SQL 错误:ORA-02438:列检查约束不能引用其他列 02438。00000 -“列检查约束不能引用其他列” *原因:试图定义列检查约束引用另一列。 *Action:将其定义为表检查常量。
  • 如果电话号码可以有前导零,则不应将其存储在 NUMBER 列中,而应存储在 VARCHAR2 或 CHAR 列中。我建议查看 Oracle 的正则表达式支持。您可以在列约束中使用正则表达式。

标签: sql oracle ddl check-constraints


【解决方案1】:

您可以使用检查约束,如下所示:

create table t (id int primary key, telephone varchar2(10), check(length(telephone) = 10))

或者如果电话号码是整数:

create table t (
    id int primary key, 
    telephone int, 
    check(telephone>= 1000000000 and telephone < 10000000000)
);

【讨论】:

  • 如果电话号码的第一个数字为零会怎样?
  • @Abra: 那么它是一个字符串,所以你要使用第一个表达式。
【解决方案2】:

电话号码通常存储为字符串,而不是数字。首先,数字并不是真正的数字。例如,将其中两个加在一起是没有意义的。其次,前导零很重要。

所以,我会推荐:

telephone varchar2(10) check (length(telephone) = 10)

如果要保持为数字,可以使用范围:

telephone number(10, 0) check (telephone >= 1000000000 and
                               telephone < 10000000000
                              )

这是明确的,没有小数位。

【讨论】:

  • Oracle 不关心字符串运算符的参数是数字还是字符串。对于数字类型的电话栏,使用check ( length(telephone) =10 ) 也足够了。
  • @BarbarosÖzhan 。 . .我认为为此目的隐式转换数字是一个坏主意(一方面)。其次,如果你不小心,那么 123.456789 会匹配——-123456789 也会匹配。
  • 是的,对 -123456789 的捕获很好,但对 123.456789 无效。考虑this Btw +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多