效果是插入或者修改學生成績,學生的績點會自動發生合理的更變,更變規則:如果分數小於60分,績點為0,如果分數大於60分則績點=(分數-50)/10*學分;
下面是觸發器(四個)的實現:
1.這是表結構
create
table score (
sid varchar(10) not
null,
cid varchar(10) not
null,
score integer
notnull
default
0check (score>=0
and score <= 100),
gp integer
default
0,primary
key (sid, cid),
foreign
key (sid)
references student (id),
foreign
key (cid)
references course (id)
);2.針對更新時分數小於60的情況建立的觸發器
create
trigger score_update_zero
after
update
of score on score
when new.score < 60
begin
update score set gp = 0
where sid = new.sid and cid = new.cid;
end;
3.針對更新時分數大於等於60的情況建立的觸發器(其中包括了績點的計算規則。其中,使用到了另外兩張參考表,主要是為了獲取課程的學分值)
create
trigger score_update_calc
after
update
of score on score
when new.score >= 60
begin
update score set gp = (((new.score-50)/10)*(select basiccourse.credit from course,basiccourse where course.id = new.cid and basiccourse.id = course.bcourseid)) where sid = new.sid and cid = new.cid;
end;
4.針對插入時分數小於60的情況
create
trigger score_insert_zero
after
insert
on score
when new.score < 60
begin
update score set gp = 0
where sid = new.sid and cid = new.cid;
end;
5.針對插入時分數大於60的情況
create
trigger score_insert_calc
after
insert
on score
when new.score >= 60
begin
update score set gp = (((new.score-50)/10)*(select basiccourse.credit from course,basiccourse where course.id = new.cid and basiccourse.id = course.bcourseid)) where sid = new.sid and cid = new.cid;
end;
以上方法是可行的,寫了四個觸發器,有點多主要是我目前只知道sqlite3支援的判斷語句只有when,我需要對兩種情況分別討論,所以將大於等於60分和小於60分兩種情況分別寫了兩個觸發器來解決。
因為一開始沒有想到這樣子寫,以為sqlite3的觸發器功能太弱,實現不亮多種情況的判斷,就沒往這方面想。於是,我通過在高階語言層次去實現績點的同步更新,結果,不如意,我的更新是對全域性的更新(因為針對區域性更新實現起來也是很麻煩),全域性的資料量很大,結果,程式介面卡死。所以我有只能又回到觸發器這裡,和同學討論中,我突然想出了這樣的解決方法,立刻實施,很好的解決了我的需求。
2023年5月6日 10:34:04 by jack lu
Sqlite 建立觸發器
建立班級表 create table class id integer primary key autoincrement,班級編號 classname nvarchar 50 班級名稱 建立學生表 create table student id integer primary key autoin...
Sqlite 建立觸發器(刪除)
今天在移動裝置上需要做乙個刪除功能,兩個表itembase和itemsd,其中,itembase的id欄位和itemsd的sdpid欄位是一對一關係,現在要求刪除一條itembase的同時也刪除對應的itemsd,於是就想到了使用觸發器,寫法如下 create trigger itembase de...
替代觸發器和系統觸發器
為什麼使用instead of觸發器?在簡單的檢視上往往可以執行insert update delete操作的,但在複雜檢視上是有限制的,比如有分組 集合運算子的,這時就需要建立替代觸發器 instead of是只適用於檢視上的一種觸發器,不能指定before和after選項,create orre...