2013-05-16 3 views
0

Я пытаюсь установить ограничение, в котором пользователю разрешено вводить только 11 цифр в тип данных номера (номер телефона). Я попыталсяOracle DB - установить номер ввода в точную длину

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

Если у вас нет ограничения на число, моя альтернатива для этого будет заключаться в изменении типа данных на VARCHAR – bn60

ответ

2

Задайте тип данных для этой колонки до varchar(11). Если это должно быть ровно 11 символов каждый раз, ограничение проверки гарантирует, что: check (length(phone_no) = 11). Для того, чтобы гарантировать длину и «numerality» (все цифры, без букв), используйте

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

Если вы должны использовать числовой тип - и это плохая идея - ваш лучший выбор, вероятно, числовой (11, 0).

Ограничение проверки может помочь вам ограничить диапазон допустимого ввода, но нет числовых типов, которые хранят ведущие нули. Вам придется перепрыгнуть через ненужные и избегаемые обручи, если что-то вроде 00125436754 является действительным номером телефона.

+0

@MikeSherill Я знаю, что изменение типа данных в varchar (11) будет работать (как я уже упоминал выше) , но есть ли способ сделать проверку (подтверждение ввода) для типа данных Number вместо? – bn60

+0

@Catcall Ранее я тестировал другой стол, задавая тип данных varchar (5). Я вводил 3 символа, и оракул принял мой вход (так как он меньше 5 символов). Ясно, что я требую контрольного ограничения, если мне нужен точный ввод. – bn60

+0

@ user1433571: Обновленный ответ. –

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) 

Другой способ заключается в использовании log базы 10: (выглядит более сложным)

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

Если данное число имеет 11 цифр, его значение log будет равно 10.xxxx.

+1

Хорошо, я попробую так. Но это кажется длинным, по сравнению с изменением типа данных на varchar. Угадай, проверяя длину номера, кажется сложным по сравнению с варчаром ... Спасибо! – bn60

+0

Да, вы можете использовать 'varchar'. Если вы используете 'varchar', вы должны убедиться, что входные данные не содержат букв или специальных символов для целостности данных. – ntalbs

+0

Недавно я нашел более простой способ сделать это и отредактировать свой ответ. – ntalbs

Смежные вопросы