1. 程式人生 > >sqlite3 觸發器(分數和績點同步更新)

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

效果是插入或者修改學生成績,學生的績點會自動發生合理的更變,更變規則:如果分數小於60分,績點為0,如果分數大於60分則績點=(分數-50)/10*學分;

下面是觸發器(四個)的實現:
1.這是表結構
CREATE TABLE Score (
sId                  VARCHAR(10)                    not null,
cId                  VARCHAR(10)                    not null,
score                INTEGER                        not null default
0 check (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的觸發器功能太弱,實現不亮多種情況的判斷,就沒往這方面想。於是,我通過在高階語言層次去實現績點的同步更新,結果,不如意,我的更新是對全域性的更新(因為針對區域性更新實現起來也是很麻煩),全域性的資料量很大,結果,程式介面卡死。所以我有隻能又回到觸發器這裡,和同學討論中,我突然想出了這樣的解決方法,立刻實施,很好的解決了我的需求。

2017年5月6日 10:34:04 By Jack Lu