sqlite3 觸發器(分數和績點同步更新)
阿新 • • 發佈:2019-02-17
效果是插入或者修改學生成績,學生的績點會自動發生合理的更變,更變規則:如果分數小於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