【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所以不變。
在這裏插入圖片描述

觸發器是十分靈活的,可以有很方便的各種應用。

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