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值的数量