我已經看到MySQL觸發器被提及,我很好奇它們是否可以用於我的場景。那是:關於使用MySQL觸發器的問題
讓我說我有一個表results_tb
。目前有一個字段score
和一個字段grade
。那麼我可以使用觸發器來更新比分變化時的成績嗎?
所以舉例來說,可以說存儲的得分爲40,等級更新爲C,那麼如果再次將比分更新爲70,等級更新爲A.
這可能與觸發器?
我已經看到MySQL觸發器被提及,我很好奇它們是否可以用於我的場景。那是:關於使用MySQL觸發器的問題
讓我說我有一個表results_tb
。目前有一個字段score
和一個字段grade
。那麼我可以使用觸發器來更新比分變化時的成績嗎?
所以舉例來說,可以說存儲的得分爲40,等級更新爲C,那麼如果再次將比分更新爲70,等級更新爲A.
這可能與觸發器?
您可以使用觸發器如果你想,但我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 ;
嗨,布賴恩,我不熟悉觸發器,但每次你更新表中的任何一行時,它會遍歷表的每一行?對於每個修改的行或表中的每一行,「對於每一行」意味着什麼?在此先感謝 – Clash 2011-05-15 21:39:14
FOR EACH ROW BEGIN將遍歷由任何SQL語句執行修改過的每一行。 – 2011-05-15 23:53:26
那麼,你可以創建一個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
如果您的成績來自分數,我不明白爲什麼要存儲成績,我會改用功能。國際海事組織這種邏輯不應該存儲在數據庫級別雖然 – Clash 2011-05-15 18:27:08
以及我只是想在那裏出口記錄的檔次。 – buymypies 2011-05-15 18:28:20
您可以導出不在表格中的字段,只需創建一個計算分數的函數,然後您可以像SELECT score,calcGrade(score)FROM ...一樣查看http://dev.mysql。 com/doc/refman/5.0/en/create-procedure.html – Clash 2011-05-15 18:31:19