Mysql 触发问题请告知 我想在一个表中用一个触发器更新一个列,在本质上自动更新指定列,因为选择列被更新/插入,如果NULL在整个计算中不考虑它们。

Mysql 触发问题请告知 我想在一个表中用一个触发器更新一个列,在本质上自动更新指定列,因为选择列被更新/插入,如果NULL在整个计算中不考虑它们。,mysql,triggers,mysql-workbench,Mysql,Triggers,Mysql Workbench,我知道它应该是这样的: 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

我知道它应该是这样的:

 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;
是的,我知道在这之前和之后我也需要一个分隔符语句,我需要检查null条目是null还是实际值,并且不使用null进行计算。如果有人有任何线索,我可以做什么来实现这一点,请通知我,因为我还没有遇到任何例子或教程,可以让我这样做。下面是我到目前为止关于这个表的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));
创建表学生类(StudentClassID INTEGER主键自动递增,
学生整数,
外键(StudentID)参考学生(StudentID),
ClassID整数,
开始日期,
转让1 NVARCHAR(3),
限制学生班级作业1
检查(赋值1=0),
转让2 NVARCHAR(3),
学生、班级、作业2
检查(赋值2=0),
转让3 NVARCHAR(3),
学生、班级、作业3
检查(赋值3=0),
转让4 NVARCHAR(3),
学生、班级、作业4
检查(赋值4=0),
GPA INT(3.2));

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

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

其次,INSERT和UPDATE row触发器可以访问名为NEW的“伪记录”,它包含基表中的每一列,并包含触发操作完成后的字段值。(更新和删除也有旧的伪记录,其中包含与DML发布前相同的值。删除没有新的,插入没有旧的,原因应该是显而易见的。)使用NEW的方式与在SELECT中使用表别名的方式相同,方法是将各个列引用为
NEW.column1
NEW.column2
&c

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

可以找到一个简单触发器的示例。在该示例中,
收入
列位于表
家庭
(触发表)中,而
总收入
位于另一个表
学生

我希望这会让你们开始,我很乐意澄清任何需要澄清的问题

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

当单个赋值可以
NULL
时,计算平均赋值分数是可能的,尽管我承认这花了我一些时间。(您确定这只是一项学校作业吗?)不过,这不会在
的WHERE
中进行,而是在视图的
选择的列列表中进行。在触发器中,它将使用与任何其他过程语言相同的局部变量来完成

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)
因为分母是

(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
是一个运行时错误。

您是否可以更清楚地了解是否涉及第二个表。太模糊了。你需要大大改善这一点你到底想做什么?包括一个数据模型和样本数据总是能够提供清晰的信息。当然,如果有任何人有任何额外的问题,我能够回答他们,请问我我应该拿4个条目,并从中得出平均分数,我们给出了学生的名字和姓氏(每个都在自己的列中)他们正在使用的类,或者更好的是,让我发布SQL代码,因为我到目前为止已经有了它:只是为了让每个人都知道它都在这个表中,不会从这个触发器创建额外的表,只是添加到现有的表中。啊,好的,那么我有几个问题要问你,你能先给出一个exmaple的通用视图吗?通过一些细节来解释什么是什么,至少有一点,这样我就可以看到它真正在做什么,以及如何跨越多个列来获得本质上的平均分数?哦,是的,这是课程作业,我的导师是。是的,他很乐意说出我对他们的看法。哦,对于新创建的表名,是表名还是表名。新的?只要确保我的概念正确=)一个视图的例子就是
创建视图avg_分数作为SELECT studentid,((赋值1+赋值2+赋值3+赋值4)/4)作为学生课堂的avg_分数然后,您可以使用
选择s.name,as.avg_score FROM students s,avg_score as WHERE s.studentid=as.studentid获取姓名和平均分数我刚刚添加了一个链接到一个使用新旧触发器的简单触发器示例。谢谢你,这将大大有助于我解决所有这些问题。另外一个问题是,是否也可以像您那样使用WHERE命令来进行赋值,这样,如果任何赋值为null(默认值atm),它就不会将其用于计算,并让它计算非null值的数量