触发问题请指教

时间:2015-12-02 06:05:10

标签: mysql triggers mysql-workbench

我正在考虑使用触发器更新表中的列,我实际上是在更新/插入选择列时自动更新指定的列,如果为null则在整体计算中不考虑它们。 / p>

我知道它应该是这样的:

 CREATE TRIGGER gpa AFTER INSERT(or update not sure which here)
 ON student_classes FOR EACH ROW BEGIN

        (here is where i start drawing a blank because none of the trigger tutorial
         sites explain how to do something i could do in excel with little problems
         IE figuring an average spanning multiple columns)

    END;

是的我知道我之前和之后都需要一个分隔符语句,我需要检查空条目是否为空或实际值,而不是使用空值进行计算。如果有人知道我可以做些什么来实现这一点,请通知我,因为我还没有遇到任何允许我这样做的示例或教程。这是到目前为止我对此表的SQL代码。

CREATE TABLE Student_Classes (StudentClassID INTEGER PRIMARY KEY AUTOINCREMENT,

StudentID INTEGER,

FOREIGN KEY(StudentID) REFERENCES Students(StudentID),

ClassID INTEGER,

StartDate DATE,

Assignment1 NVARCHAR(3),

CONSTRAINT CK_Students_Classes_Assignment1

    Check (Assignment1 <= 100 AND Assignment1 >= 0),
Assignment2 NVARCHAR(3),

CONSTRAINT CK_Students_Classes_Assignment2

    Check (Assignment2 <= 100 AND Assignment2 >= 0),

Assignment3 NVARCHAR(3),
CONSTRAINT CK_Students_Classes_Assignment3

    Check (Assignment3 <= 100 AND Assignment3 >= 0),

Assignment4 NVARCHAR(3),
CONSTRAINT CK_Students_Classes_Assignment4

    Check (Assignment4 <= 100 AND Assignment4 >= 0),

GPA INT(3.2));

1 个答案:

答案 0 :(得分:0)

由于这显然是为了课程作业,我不会简单地给你答案,但我会尝试给你一些有用的提示和指示。

首先,如果您使用触发器修改当前记录中的列,通常需要 之前将新数据保存到表。

其次,INSERT和UPDATE行触发器可以访问&#34;伪记录&#34;名为 NEW ,其中包含基表中的每一列,并包含字段值 ,因为它们将在触发操作完成后 。 (UPDATE和DELETE也有 OLD 伪记录,其中包含 之前的值 DML的发布.DELETE没有 NEW 并且INSERT没有 OLD ,原因应该是很明显的。)您使用 NEW 的方式与SELECT中的表别名相同,将各列引用为NEW.column1NEW.column2&amp; c。

第三,行触发器通常必须在它所附着的表上执行显式DML。触发器 由DML语句 调用,它是调用语句,一旦触发器代码完成,它将执行DML。您只需从中获取值,根据需要对其进行操作,然后将修改后的值重新放回

可以找到简单触发器的示例here。在该示例中,列income位于表family(触发表)中,而total_income位于另一个表student中。

我希望这会让你开始,我很乐意澄清任何需要它的观点。

编辑:根据您的评论,关于计算平均计算的分母:我在这里回答这个问题,因为它有更多的空间和更好的格式。

当个别作业可以NULL时,计算平均作业标记是可能的,虽然我承认它让我有所思考。 (你确定这只是一项学校作业吗?)但这不会在WHERE中完成,而是在视图SELECT的列列表中完成。在触发器中,它将使用与任何其他过程语言相同的局部变量来完成。

NULL - 分子的安全计算是

(COALESCE(assignment1, 0) + COALESCE(assignment2, 0)
  + COALESCE(assignment3, 0) + COALESCE(assignment4, 0))

并且分母将是

NULLIF(IF(assignment1 IS NULL, 0, 1) + IF(assignment2 IS NULL, 0, 1)
  + IF(assignment3 IS NULL, 0, 1) + IF(assignment4 IS NULL, 0, 1), 0)

我将分母计算包装在IFNULL中以防止被零除,因为x / NULL = NULL,而x / 0是运行时错误。