我正在尝试设置一个约束,其中只允许用户在数字数据类型(电话号码)中输入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)
/
但收到了错误。对于第一个,我一直收到错误,因为它没有检测到字符长度,而第二个,给了我一个无效的标识符。
感谢您的帮助!
答案 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。