在使用MySQL的檢查(check)約束時(shí),向表中插入不符合約束條件的數(shù)據(jù)行時(shí),也能插入成功不會(huì)報(bào)錯(cuò)!
建表語(yǔ)句如下:
create table person
(
person_id int unsigned,
fname varchar(16),
lname varchar(16),
gender char(1) check(gender in ('M','F')),
birth_date date,
constraint pk_test_person primary key (person_id)
);
向其中插入行
INSERT INTO `person` (`person_id`, `fname`, `lname`, `gender`, `birth_date`)
VALUES (1, 'Zhang', 'San', 'a', '2019-03-28')
居然返回
1 row affected in 10 ms
看來(lái)check約束是白寫了,沒有起作用.
經(jīng)過(guò)上網(wǎng)查看發(fā)現(xiàn),MySQL只是可以使用check約束,但不會(huì)強(qiáng)制的遵循check約束!
官方推薦使用枚舉類型(ENUM)來(lái)替代以上的使用check約束的情況.將表中的gender字段修改成如下類型:
(注意修改前的表中數(shù)據(jù)不能有g(shù)ender字段含有不是'M'或'F'的數(shù)據(jù)行,否則不能執(zhí)行以下語(yǔ)句,會(huì)報(bào)錯(cuò))
ALTER TABLE person MODIFY gender enum('M', 'F');
執(zhí)行alter語(yǔ)句后的person表的gender就會(huì)在插入和修改時(shí)嚴(yán)格驗(yàn)證屬于的數(shù)據(jù)是否合法啦!
測(cè)試一下:
如下插入語(yǔ)句會(huì)報(bào)錯(cuò)
insert into person (person_id, fname, lname, gender, birth_date)
values (1,'Zhang','San','X','2019-03-28');
當(dāng)輸入正確的語(yǔ)句時(shí)不會(huì)報(bào)錯(cuò),通過(guò)驗(yàn)證
insert into person (person_id, fname, lname, gender, birth_date)
values (1,'Zhang','San','M','2019-03-28');