sqlite3 觸發器(分數和績點同步更新)

2021-07-31 16:15:18 字數 2300 閱讀 9996

效果是插入或者修改學生成績,學生的績點會自動發生合理的更變,更變規則:如果分數小於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...