MySQL触发器IF语句错误(不会创建)

时间:2015-02-10 19:38:23

标签: mysql triggers

如果学生的得分高于此值,我想创建这样的Trigger  其他栏目的分数将自动插入值(字母)

 DELIMITER |
    CREATE TRIGGER N_Angka BEFORE INSERT ON nilai
    FOR EACH ROW
    BEGIN
        IF nilai_angka <= 50 THEN
                UPDATE nilai SET NEW.nilai_huruf = 'C-';
            ELSE IF nilai_angka < 55 THEN
                UPDATE nilai SET NEW.nilai_huruf = 'C';
            ELSE IF nilai_angka < 59 THEN
                UPDATE nilai SET NEW.nilai_huruf = 'C+';
            ELSE IF nilai_angka <= 60 THEN
                UPDATE nilai SET NEW.nilai_huruf = 'B-';
            ELSE IF nilai_angka < 75 THEN
                UPDATE nilai SET NEW.nilai_huruf = 'B';
            ELSE IF nilai_angka <= 80 THEN
                UPDATE nilai SET NEW.nilai_huruf = 'B+';
            ELSE IF nilai_angka <= 85 THEN
                UPDATE nilai SET NEW.nilai_huruf = 'A-';
            ELSE IF nilai_angka <= 90 THEN
                UPDATE nilai SET NEW.nilai_huruf = 'A';
            ELSE IF nilai_angka <= 99 THEN
                UPDATE nilai SET NEW.nilai_huruf = 'A+';
            ELSE
                UPDATE nilai SET NEW.nilai_huruf = 'S';
            END IF;
    END |
    DELIMITER ;

它表示第26行的错误在

END IF;

有人可以解释并为我提供一些解决方案

2 个答案:

答案 0 :(得分:1)

您无法使用UPDATE,但可以根据NEW.nilai_huruf设置NEW.nilai_angka的值,因为它是BEFORE触发器。

使用CASE表达式更简洁。

由于它现在是一个语句触发器,因此您不再需要使用BEGIN...END块。

CREATE TRIGGER N_Angka
BEFORE INSERT ON nilai
FOR EACH ROW
  SET NEW.nilai_huruf = CASE 
    WHEN NEW.nilai_angka <=50              THEN 'C-'
    WHEN NEW.nilai_angka BETWEEN 51 AND 54 THEN 'C'
    WHEN NEW.nilai_angka BETWEEN 55 AND 58 THEN 'C+'
    WHEN NEW.nilai_angka BETWEEN 59 AND 60 THEN 'B-'
    WHEN NEW.nilai_angka BETWEEN 61 AND 74 THEN 'B'
    WHEN NEW.nilai_angka BETWEEN 75 AND 80 THEN 'B+'
    WHEN NEW.nilai_angka BETWEEN 81 AND 85 THEN 'A-'
    WHEN NEW.nilai_angka BETWEEN 86 AND 90 THEN 'A'
    WHEN NEW.nilai_angka BETWEEN 91 AND 99 THEN 'A+'
    ELSE 'S' END;

这是 SQLFiddle 演示


您最有可能想要创建一个免费的BEFORE UPDATE触发器。 此时,将逻辑提取到函数

是有意义的
CREATE FUNCTION angka_huruf(_angka INT)
RETURNS VARCHAR(2) DETERMINISTIC
RETURN CASE 
  WHEN _angka <=50              THEN 'C-'
  WHEN _angka BETWEEN 51 AND 54 THEN 'C'
  WHEN _angka BETWEEN 55 AND 58 THEN 'C+'
  WHEN _angka BETWEEN 59 AND 60 THEN 'B-'
  WHEN _angka BETWEEN 61 AND 74 THEN 'B'
  WHEN _angka BETWEEN 75 AND 80 THEN 'B+'
  WHEN _angka BETWEEN 81 AND 85 THEN 'A-'
  WHEN _angka BETWEEN 86 AND 90 THEN 'A'
  WHEN _angka BETWEEN 91 AND 99 THEN 'A+'
  ELSE 'S' END;

然后在两个触发器中重复使用

CREATE TRIGGER N_Angka
BEFORE INSERT ON nilai
FOR EACH ROW
  SET NEW.nilai_huruf = angka_huruf(NEW.nilai_angka);

CREATE TRIGGER N_Angka2
BEFORE UPDATE ON nilai
FOR EACH ROW
  SET NEW.nilai_huruf = angka_huruf(NEW.nilai_angka);

这是 SQLFiddle 演示


现在,您可以完全抛弃触发器和nilai_huruf列,只需在获取记录时使用该功能

SELECT nilai_angka, angka_huruf(nilai_angka) nilai_huruf
  FROM nilai;

这是 SQLFiddle 演示

答案 1 :(得分:0)

DELIMITER $$
CREATE TRIGGER N_Angka BEFORE INSERT ON nilai
FOR EACH ROW
BEGIN
    IF NEW.nilai_angka <= 50 THEN
            BEGIN
                SET NEW.nilai_huruf = 'C-';
                END;
        ELSEIF NEW.nilai_angka < 55 THEN
            BEGIN
                SET NEW.nilai_huruf = 'C';
                END;
        ELSEIF NEW.nilai_angka < 59 THEN
            BEGIN
                SET NEW.nilai_huruf = 'C+';
                END;
        ELSEIF NEW.nilai_angka <= 60 THEN
            BEGIN
                SET NEW.nilai_huruf = '-B';
                END;
        ELSEIF NEW.nilai_angka < 75 THEN
            BEGIN
                SET NEW.nilai_huruf = 'B';
                END;
        ELSEIF NEW.nilai_angka <= 80 THEN
            BEGIN
            SET NEW.nilai_huruf = 'B+';
                END;
        ELSEIF NEW.nilai_angka <= 85 THEN
            BEGIN
            SET NEW.nilai_huruf = 'A-';
                END;
        ELSEIF NEW.nilai_angka <= 90 THEN
            BEGIN
            SET NEW.nilai_huruf = 'A';
                END;
        ELSEIF NEW.nilai_angka <= 99 THEN
            BEGIN
            SET NEW.nilai_huruf = 'A+';
                END;
        ELSEIF NEW.nilai_angka = 100 THEN
            BEGIN
            SET NEW.nilai_huruf = 'S';
                END; 
                END IF;
END$$
DELIMITER ;

这是答案 我在触发器上更改事件