【问题标题】:What is wrong with the following trigger before an update?更新前的以下触发器有什么问题?
【发布时间】:2021-01-29 01:41:57
【问题描述】:

在对注册表进行更新之前,我必须在 mysql 中实现以下触发器

强制要求所有字母等级在此数据库中必须是 A、B、C、D 之一(无 +/-)。还要确保成绩点值匹配:A=4.0, B=3.0, C=2.0, D=1.0

  CREATE TABLE enrollment (
  student_id CHAR(4) not null,
  student_name VARCHAR(100) not null,
  course_id CHAR(7) not null,
  enroll_date DATE not null,
  letter_grade CHAR(2),
  grade_points DECIMAL(2,1),
  PRIMARY KEY (student_id, course_id)
);

这是我目前所拥有的:

create trigger letter_grade_checker before update on enrollment 
for each row
  begin
    if ((new.letter_grade != 'A' and new.grade_points != 4.0)
    or (new.letter_grade != 'B' and new.grade_points != 3.0)
    or (new.letter_grade != 'C' and new.grade_points != 2.0)
    or (new.letter_grade != 'D' and new.grade_points != 1.0))
    then SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid grade or grade_points provided';
    end if;
end;

虽然它不适用于以下更新语句:

UPDATE enrollment SET letter_grade = 'B', grade_points = 3.0
    WHERE student_id = '9999' and course_id = 'CSC-399';

【问题讨论】:

    标签: mysql


    【解决方案1】:

    你的布尔表达式应该是这样的

        if  (new.letter_grade != 'A' or new.grade_points != 4.0)
        and (new.letter_grade != 'B' or new.grade_points != 3.0)
        and (new.letter_grade != 'C' or new.grade_points != 2.0)
        and (new.letter_grade != 'D' or new.grade_points != 1.0)
        then ...
    

    因为逻辑是

    !((a AND b) OR (c AND d)) = !(a AND b) AND !(c AND d) = (!a OR !b) AND (!c OR !d)
    

    【讨论】:

      【解决方案2】:

      强制要求所有字母等级必须是此数据库中的 A、B、C、D 之一(无 +/-)。还要确保成绩点值匹配:A=4.0, B=3.0, C=2.0, D=1.0

      更改letter_grade 列定义并添加相应的约束:

        CREATE TABLE enrollment (
        student_id CHAR(4) not null,
        student_name VARCHAR(100) not null,
        course_id CHAR(7) not null,
        enroll_date DATE not null,
        letter_grade CHAR(1) CHECK (letter_grade IN ('A','B','C','D')),
        grade_points DECIMAL(2,1),
        PRIMARY KEY (student_id, course_id),
        CHECK (grade_points = FIND_IN_SET(letter_grade, 'D,C,B,A'))
      );
      

      不需要触发器。

      【讨论】:

        猜你喜欢
        • 2012-08-07
        • 1970-01-01
        • 2018-03-21
        • 2012-04-26
        • 2017-06-11
        • 2013-12-06
        • 2021-03-14
        • 1970-01-01
        相关资源
        最近更新 更多