Создание ограничения для телефона или почтового индекса в MYSQL?

#mysql #constraints

#mysql #ограничения

Вопрос:

Создание следующей таблицы (MySQL 8.0):

 create table Customer_Dim(
customer_ID     int not null,
FirstName       varchar(30) not null,
LastName        varchar(30) not null,
Gender          char(1) not null CHECK (gender in ('m','f')),
Street1         varchar(100) not null,
Street2         varchar(100) null,
City            varchar(30) not null,
StateAbbrev     char(2) not null,
ZipCode         char(5) not null CHECK (ZipCode LIKE repeat('[0-9]',5)),
PrimaryPhone    varchar(10) not null CHECK (PrimaryPhone LIKE repeat('[0-9]',10)),
EmailAddress    varchar(50) default null,
constraint custkey Primary Key(customer_ID)
);
  

но когда я ввожу следующий оператор insert:

 insert into Customer_DIM
values (10001, 'Josh', 'Dexter', 'M', '123 E Elm st.', null, 'Denver', 'CO', '80002', '2023459767', 'test@aol.com')
  

Проверка телефона и почтового индекса завершается неудачно. Из того, что я мог прочитать, это должно работать?

Комментарии:

1. Какую версию MySQL вы используете? Ниже версии 8 контрольные ограничения принимаются в CREATE TABLE операторах без каких-либо ошибок или предупреждений, но они никогда не применяются позже.

2. dev.mysql.com/doc/refman/8.0/en/…

3. Я имитирую ваш код в моем движке MySQL v5.7.31 и работает нормально!. Возможно, это ваша версия.

4. Как говорит @stickybit. Он объяснил ситуацию.

5. На самом деле я в 64-битном сообществе 8.0.21

Ответ №1:

Я считаю, что a regexp необходим repeat для (который повторяет символы)

Использование repeat ожидало бы чего-то подобного:

 mysql> select repeat('[0-9]', 5);

 --------------------------- 
| repeat('[0-9]', 5)        |
 --------------------------- 
| [0-9][0-9][0-9][0-9][0-9] |
 --------------------------- 
  

Итак, используйте regexp вместо:

 create table Customer_Dim(
customer_ID     int not null,
FirstName       varchar(30) not null,
LastName        varchar(30) not null,
Gender          char(1) not null CHECK (gender in ('m','f')),
Street1         varchar(100) not null,
Street2         varchar(100) null,
City            varchar(30) not null,
StateAbbrev     char(2) not null,
ZipCode         char(5) not null CHECK (ZipCode regexp '[0-9]{5}'),
PrimaryPhone    varchar(10) not null CHECK (PrimaryPhone regexp'[0-9]{10}'),
EmailAddress    varchar(50) default null,
constraint custkey Primary Key(customer_ID)
);
  

Тот же (хороший) пример вставки:

 insert into Customer_Dim
values (10001, 'Josh', 'Dexter', 'M', '123 E Elm st.', null, 'Denver', 'CO', '80002', '2023459767', 'test@aol.com')
  

Вставка примера плохого телефона:

 insert into Customer_Dim
values (10001, 'Josh', 'Dexter', 'M', '123 E Elm st.', null, 'Denver', 'CO', '80002', '202359767', 'test@aol.com')
  

Выдает ошибку:

Ограничение проверки ‘Customer_Dim_chk_3’ нарушено.

Вставка примера с плохим zip:

 insert into Customer_Dim
values (10001, 'Josh', 'Dexter', 'M', '123 E Elm st.', null, 'Denver', 'CO', '8002', '2023459767', 'test@aol.com')
  

Выдает ошибку:

Ограничение проверки ‘Customer_Dim_chk_2’ нарушено.

Пример скрипки DB со всей приведенной выше информацией. (включая последний repeat пример)

Знайте, что ограничения проверки MySQL были проанализированы, но игнорировались до версии 8.0.16:

введите описание изображения здесь

Комментарии:

1. Помните, что CHECK ограничения применяются, начиная с MySQL 8.0.16. Перед этой версией ограничение сохраняется, но не проверяется.

2. Да, это правда.