2011-05-15 28 views
0

我已經看到MySQL觸發器被提及,我很好奇它們是否可以用於我的場景。那是:關於使用MySQL觸發器的問題

讓我說我有一個表results_tb。目前有一個字段score和一個字段grade。那麼我可以使用觸發器來更新比分變化時的成績嗎?

所以舉例來說,可以說存儲的得分爲40,等級更新爲C,那麼如果再次將比分更新爲70,等級更新爲A.

這可能與觸發器?

+0

如果您的成績來自分數,我不明白爲什麼要存儲成績,我會改用功能。國際海事組織這種邏輯不應該存儲在數據庫級別雖然 – Clash 2011-05-15 18:27:08

+0

以及我只是想在那裏出口記錄的檔次。 – buymypies 2011-05-15 18:28:20

+0

您可以導出不在表格中的字段,只需創建一個計算分數的函數,然後您可以像SELECT score,calcGrade(score)FROM ...一樣查看http://dev.mysql。 com/doc/refman/5.0/en/create-procedure.html – Clash 2011-05-15 18:31:19

回答

1

您可以使用觸發器如果你想,但我Nanne中似乎是更好的辦法條款達成共識描述的情況。

DELIMITER | 

DROP TRIGGER /*!50032 IF EXISTS */ `trigger_update_results_tb`| 

CREATE TRIGGER `trigger_update_results_tb` BEFORE UPDATE ON `results_tb` 
    FOR EACH ROW BEGIN 
     CASE FLOOR(NEW.score/10) 
     WHEN 0 THEN SET NEW.grade = 'F'; 
     WHEN 1 THEN SET NEW.grade = 'F'; 
     WHEN 2 THEN SET NEW.grade = 'F'; 
     WHEN 3 THEN SET NEW.grade = 'F'; 
     WHEN 4 THEN SET NEW.grade = 'D'; 
     WHEN 5 THEN SET NEW.grade = 'C'; 
     WHEN 6 THEN SET NEW.grade = 'B'; 
     ELSE SET NEW.grade = 'A'; 
     END CASE; 
    END; 
| 

DELIMITER ; 
+0

嗨,布賴恩,我不熟悉觸發器,但每次你更新表中的任何一行時,它會遍歷表的每一行?對於每個修改的行或表中的每一行,「對於每一行」意味着什麼?在此先感謝 – Clash 2011-05-15 21:39:14

+1

FOR EACH ROW BEGIN將遍歷由任何SQL語句執行修改過的每一行。 – 2011-05-15 23:53:26

1

那麼,你可以創建一個trigger,觸發'更新'。 manual很清楚。但是你必須製作某種與你的分數相符的「成績單」。所以你應該有一份列表,將成績與成績進行比較。這聽起來很像我的「查找表」。

難道你不能僅僅爲屬於某個分數的等級添加一個表格給你的數據庫,並且如果你查詢了當前的results_tb,那麼在該表格中添加一個join

所以不是

SELECT score, grade FROM results_tb WHERE id=1 

你會得到

SELECT r.score, l.grade FROM results_tb r 
JOIN lookup l ON r.score = l.score 
WHERE r.id=1