參考網址: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所以不變。
觸發器是十分靈活的,可以有很方便的各種應用。