Oracle DB - 将输入数字设置为精确长度

时间:2013-05-16 01:06:22

标签: sql database oracle

我正在尝试设置一个约束,其中只允许用户在数字数据类型(电话号码)中输入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)
/

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

将该列的数据类型设置为varchar(11)。如果每次必须精确为11个字符,则检查约束将保证:check (length(phone_no) = 11)。要保证长度和“数字”(所有数字,无字母),请使用

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

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

检查约束可以帮助您限制有效输入的范围,但没有数字类型存储前导零。如果00125436754之类的内容是有效的电话号码,您必须跳过不必要且可避免的箍。

答案 1 :(得分:0)

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

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

此检查约束足够简单。而且您不必将数据类型从number更改为varchar2,也不必检查输入是否包含除数字之外的字符。

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

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)

另一种方法是使用基数10的log :(看起来更复杂)

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

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