Ограничить запись, вставленную в mysql, а именно 9 цифр - PullRequest
0 голосов
/ 04 августа 2020

У меня есть поле в моей базе данных, которое представляет собой номер телефона, я хочу, чтобы оно принимало только точные 9 номеров

Mysql версия: 5.7.31

Ответы [ 3 ]

2 голосов
/ 04 августа 2020

Добавить в соответствии с Ограничением CHECK .

Как ограничение столбца:

CREATE TABLE my_table (
    ...
    phone_number INT 
                 NOT NULL 
                 CHECK (phone_number BETWEEN 100000000 AND 999999999),
    ... );

или как ограничение таблицы:

CREATE TABLE my_table (
    ...
    phone_number INT 
                 NOT NULL,
    CONSTRAINT phone_9_digits 
        CHECK (phone_number BETWEEN 100000000 AND 999999999),
    ... );

Ограничение касается только с одним столбцом - поэтому предпочтительнее использовать тип ограничения столбца.

Как я могу сделать это с существующей таблицей?

Изменить определение столбца или определение таблицы. Например,

ALTER TABLE my_table
CHANGE COLUMN phone_number 
              phone_number INT 
                           NOT NULL 
                           CHECK (phone_number BETWEEN 100000000 AND 999999999);

Если вы используете старую MySQL версию, которая не поддерживает ограничения CHECK, используйте пакет триггеров.

CREATE TRIGGER tr_bi_check_phone_for_9digits
BEFORE INSERT -- and the same for BEFORE UPDATE
ON my_table
FOR EACH ROW
BEGIN
    IF NEW.phone_number NOT BETWEEN 100000000 AND 999999999 THEN                        
        SIGNAL SQLSTATE '45000' 
        SET MESSAGE_TEXT = 'Phone Number must have 9 digits strictly.';
    END IF;
END

Если phone_number хранится в виде строки, тогда условие проверки phone_number BETWEEN 100000000 AND 999999999 может быть заменено, например, на

phone_number REGEXP '[0-9]{9}'

. Это также позволит вам сохранять телефонные номера, начинающиеся с нуля.

1 голос
/ 04 августа 2020

Во-первых, я бы не хотел реализовывать этот c logi в базе данных. Скорее всего, он изменится (не во всех странах используется одинаковый формат номера телефона, и даже внутри страны формат номера телефона иногда меняется). Возможно, вы захотите применить какое-то форматирование (например, отделить код города от номера). Как правило, использовать ошибки базы данных как способ сообщения о проблемах форматирования не очень хорошо - пользовательский интерфейс должен понимать это logi c, а управлять им нелегко.

Но если вы действительно хотите это сделать в базе данных вы можете создать триггер для проверки ввода перед записью его в таблицу и выдать ошибку в противном случае.

0 голосов
/ 04 августа 2020

Заполняли ли вы форму только для того, чтобы вам плюнули за то, что вы не используете точный интервал, тире, скобки и т. Д. c, что это ожидается для почтового индекса, телефона, кредитной карты number?

Ради пользователей я настоятельно рекомендую вам разрешить любой обычно допустимый интервал, et c. Затем удалите лишнее. Если что-то пойдет не так, плюните на пользователя из пользовательского интерфейса, не базы данных. Данные в базе данных должны быть очищены пользовательским интерфейсом.

А как насчет +1 (или любого другого кода страны), который ставится перед телефонными номерами, пригодными для использования в разных странах? Или ваше приложение является приложением для одной страны и всегда будет таковым?

...