【mysql练习三】使用 ENUM 枚举类型 或者使用 触发器

参考网址: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所以不变。
在这里插入图片描述

触发器是十分灵活的,可以有很方便的各种应用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章