参考网址:MySql CHECK使用方法
在使用MySQL时,实现用户定义完整性使用CHECK语句,
但是实际上我在mysql8的版本试了,并不可行。
所以如果要进行限制,比较好的方法就是触发器和暴力枚举了。
1.暴力枚举
create table test5(
order_id int auto_increment primary key,
PersonID int default 0,
Class enum('Class One','Class Two'),
InSchoolDay datetime default current_timestamp,
foreign key(PersonID) references test1(PersonID) on update cascade on delete cascade,
ChangeTime datetime default current_timestamp on update current_timestamp);
此时尝试插入Class Three的项就会失败了:
insert into test5(PersonID,Class) values('11603009','Class Three');
可以看到报错:
这里如果要增加Class Three就需要改变Class列才行:
alter table test5 modify column Class enum('Class One','Class Two','Class Three');
insert into test5(PersonID,Class) values('11603009','Class Three');
这样一来就成功了:
不过如果这个表很大的话,就会很不方便,我们应该尽量不要用alter的。
所以下面介绍触发器:
2.触发器
删除触发器:
drop trigger [触发器名];
查看触发器:
show triggers;
创建一个触发器: delimiter设置终止符号为//
DELIMITER //
create trigger class_type after insert
on test5 for each row
begin
if(new.Class!='Class One' and new.Class!='Class Two') then
delete from test5 where Class=new.Class ;
end if;
end;//
这样就禁止了不是Class One和Class Two的插入:
insert into test5(PersonID,Class) values('11603010','Class Three');//
insert into test5(PersonID,Class) values('11603010','Class One');//
得到结果:
最后把终止符设置回;
DELIMITER ;
触发器除了可以限制插入,还可以做很多事,例如建立一个error表
:如果触发了条件,就向error表写入条目和日期,相当于一个自动日志了。
还可以同时进行多个操作:
例如:
DELIMITER //
create trigger insert_three after insert
on test5 for each row
begin
update test3 set Class=new.Class where PersonID='11603009';
insert into test3(PersonID,Class) values('11603008','Class One');
end;//
得到结果:
1.test5表里插入了一条11603009
2.test3里插入了一条11603008
3.test3中的11603009的class变成了Class One,由于本身就是Class one所以不变。
触发器是十分灵活的,可以有很方便的各种应用。