【问题标题】:question regarding use of MySQL triggers关于使用 MySQL 触发器的问题
【发布时间】:2011-05-15 18:20:45
【问题描述】:

我已经看到提到的 MySQL 触发器,我很好奇它们是否可以用于我的场景。那就是:

假设我有一张桌子results_tb。目前有一个字段 score 和一个字段 grade 。那么我可以使用触发器来更新分数变化事件的成绩吗?

例如,假设存储的分数为 40,则成绩更新为 C,然后再次如果分数更新为 70,则成绩更新为 A。

这可以通过触发器实现吗?

【问题讨论】:

  • 如果你的成绩是从分数得出的,我不明白为什么要存储成绩,我会改用一个函数。 IMO 这种逻辑不应该存储在数据库级别虽然
  • 好吧,我只是想要导出记录的成绩。
  • 您可以导出不在表格中的字段,只需创建一个计算成绩的函数,然后您就可以像 SELECT score, calcGrade(score) FROM ... 看看@ 987654321@
  • 是的,我知道我可以做到,我只是有点想使用触发器,真的只是学习一些新东西。不过谢谢:)

标签: mysql sql triggers


【解决方案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 ;

【讨论】:

  • 嗨,Brian,我不熟悉触发器,但是每次更新表的任何行时,它会遍历表的每一行吗? “对于每一行”是指每个修改的行还是表格的每一行?提前致谢
  • FOR EACH ROW BEGIN 将遍历已被执行的任何 SQL 语句修改的每一行。
【解决方案2】:

好吧,您可以创建一个在“更新”时触发的triggermanual 很清楚。但是您必须制作某种与您的分数相对应的等级“列表”。所以你会有一个比较分数和成绩的列表。对我来说,这听起来有点像“查找表”。

您不能将属于某个分数的成绩表添加到您的数据库中,如果您查询当前的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-17
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多