#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. Да, это правда.