1

我正在尝试设置一个约束条件,即只允许用户在数字数据类型(电话号码)中输入 11 位数字。我试过了

alter table "booyeah" add constraint
"booyeah_CC1" check ( LENGTH("PHONE_NO") = 11)
/

alter table "booyeah" add constraint
"booyeah_CC1" check ( PRECISION("PHONE_NO") = 11)
/

但出现错误。对于第一个,我一直收到错误,因为它没有检测到字符长度,而第二个给了我一个无效的标识符。

谢谢您的帮助!

4

2 回答 2

3

将该列的数据类型设置为varchar(11)。如果每次都必须恰好是 11 个字符,则检查约束将保证:check (length(phone_no) = 11). 为了保证长度和“数量”(所有数字,没有字母),使用

check (length(phone_no) = 11 and 
       regexp_like(phone_no, '^[[:digit:]]{11}$')
)

如果你必须使用数字类型——这是个坏主意——你最好的选择可能是数字(11,0)。

检查约束可以帮助您限制有效输入的范围,但没有数字类型存储前导零。00125436754如果诸如有效的电话号码之类的东西,您将不得不跳过不必要且可避免的麻烦。

于 2013-05-16T01:16:14.423 回答
0

您可以添加以下检查约束:

... check (length(n||'')=11)

这个检查约束非常简单。而且您不必将数据类型从 更改numbervarchar2,也不必检查输入是否包含数字以外的字符。

我创建了简单的表并检查它是否正常工作:

create table t (n number check (length(n||'')=11));

insert into t values (1234567890); -- 10 digits
=> ORA-02290: check constraint (USER_4_552B1.SYS_C001297489) violated : insert into t values (1234567890)

insert into t values (12345678901);
=> Record Count: 0; Execution Time: 1ms

insert into t values (123456789012); -- 12 digits
=> ORA-02290: check constraint (USER_4_552B1.SYS_C001297489) violated : insert into t values (123456789012)

另一种方法是使用logbase 10:(看起来更复杂)

... check (trunc(log(10,phone_no)) = 10)

如果给定的数字有 11 位,则其log值为 10.xxxx。

于 2013-05-16T01:18:06.697 回答