我正在考虑使用触发器更新表中的列,我实际上是在更新/插入选择列时自动更新指定的列,如果为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));
答案 0 :(得分:0)
由于这显然是为了课程作业,我不会简单地给你答案,但我会尝试给你一些有用的提示和指示。
首先,如果您使用触发器修改当前记录中的列,通常需要 之前将新数据保存到表。
其次,INSERT和UPDATE行触发器可以访问&#34;伪记录&#34;名为 NEW ,其中包含基表中的每一列,并包含字段值 ,因为它们将在触发操作完成后 。 (UPDATE和DELETE也有 OLD 伪记录,其中包含 之前的值 DML的发布.DELETE没有 NEW 并且INSERT没有 OLD ,原因应该是很明显的。)您使用 NEW 的方式与SELECT中的表别名相同,将各列引用为NEW.column1
,NEW.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
是运行时错误。