首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLLite上的多个更新触发器

SQLLite上的多个更新触发器
EN

Stack Overflow用户
提问于 2013-03-09 22:04:38
回答 2查看 3.4K关注 0票数 1

我想要做的是管理新生的成绩归因。如果插入的包含学生ID和成绩的元组的成绩值小于9或大于12,我们希望将该值更改为NULL。同时,如果插入的元组具有等级空值,我们希望将其更改为9。

下面的代码有什么问题?

代码语言:javascript
复制
CREATE TRIGGER R1
AFTER INSERT ON Students
FOR EACH ROW 
BEGIN

  UPDATE Students
     SET grade = NULL 
   WHERE grade < 9 OR grade > 12;

  UPDATE Students
     SET grade = 9 
   WHERE grade = NULL;

END;

请注意,这两个UPDATE语句必须在INSERT执行后立即对Student表执行。我们将有空值更新为9级,并将大于9或> 12的值更新为空

EN

回答 2

Stack Overflow用户

发布于 2013-03-09 22:19:17

您应该将第二个条件从= NULL替换为IS NULL

代码语言:javascript
复制
UPDATE Students
     SET grade = 9 
   WHERE grade IS NULL;

= NULLIS NULL的证明:http://sqlfiddle.com/#!5/a51de/1

其他解决方案:

http://sqlfiddle.com/#!5/78288/1

代码语言:javascript
复制
CREATE TRIGGER TStudents3
AFTER INSERT ON Students3
FOR EACH ROW
/* we check update conditions here */
WHEN  NEW.grade IS NULL
  OR  NEW.grade < 9
  OR  NEW.grade > 12
BEGIN

  UPDATE Students3
     SET grade =
       CASE
         WHEN grade IS NULL THEN 9
         /* actually you could drop this 2 lines, because a missing ELSE returns NULL: */
         WHEN grade < 9 OR grade > 12 THEN NULL
         ELSE grade
       END
   /* We just want to update the freshly inserted row, not all row! */
   WHERE  id = NEW.id;

END
票数 2
EN

Stack Overflow用户

发布于 2016-01-26 21:27:43

另一种方法是移动where子句中的条件:

代码语言:javascript
复制
CREATE TRIGGER tr1 AFTER INSERT ON Student
BEGIN
     UPDATE Student SET grade = null WHERE id = NEW.id and (new.grade<9 or new.grade>12);
     UPDATE Student SET grade = 9 WHERE id = NEW.id and new.grade is null;
END;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15311566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档