在MYSQL中为电话或邮政编码创建约束?
创建下表(MySQL 8.0): 但当我输入以下insert语句时:在MYSQL中为电话或邮政编码创建约束?,mysql,constraints,Mysql,Constraints,创建下表(MySQL 8.0): 但当我输入以下insert语句时: insert into Customer_DIM values (10001, 'Josh', 'Dexter', 'M', '123 E Elm st.', null, 'Denver', 'CO', '80002', '2023459767', 'test@aol.com') 它无法通过电话和zipCode的检查。从我所能读到的来看,它应该是有效的。我认为需要一个regexp,而不是repeat(重复字符) 使用repe
insert into Customer_DIM
values (10001, 'Josh', 'Dexter', 'M', '123 E Elm st.', null, 'Denver', 'CO', '80002', '2023459767', 'test@aol.com')
它无法通过电话和zipCode的检查。从我所能读到的来看,它应该是有效的。我认为需要一个
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')
insert into Customer_Dim
values (10001, 'Josh', 'Dexter', 'M', '123 E Elm st.', null, 'Denver', 'CO', '8002', '2023459767', 'test@aol.com')
错误电话示例插入:
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')
insert into Customer_Dim
values (10001, 'Josh', 'Dexter', 'M', '123 E Elm st.', null, 'Denver', 'CO', '8002', '2023459767', 'test@aol.com')
给出了错误:
违反了检查约束“Customer\u Dim\u chk\u 3”
错误的zip示例插入:
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')
insert into Customer_Dim
values (10001, 'Josh', 'Dexter', 'M', '123 E Elm st.', null, 'Denver', 'CO', '8002', '2023459767', 'test@aol.com')
给出了错误:
违反了检查约束“Customer\u Dim\u chk\u 2”
数据库与所有上述信息。
(包括上次重复的示例)
知道MySQL检查约束在版本8.0.16之前已被解析但被忽略:
您使用的是什么版本的MySQL?下面的版本8检查约束在CREATE TABLE
语句中被接受,没有任何错误或警告,但以后不会强制执行。我在我的引擎MySQL v5.7.31中模拟您的代码,工作正常!。也许是你的版本。比如说@stickybit。他已经解释了这种情况。我现在在8.0.21 64位社区,实际上我发现从MySQL 8.0.16开始,CHECK
约束是强制的。在该版本之前,约束已存储但未检查。是的,这是真的。