MySQL 触发器 IF 语句错误(不会创建)
MySQL Trigger IF Statement Error (Won't Create)
我想像这样创建触发器,如果学生的分数高于这样
其他列的分数将自动插入值(字母)
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;
有人可以为我解释并提供一些解决方案吗
您不能使用 UPDATE
但您可以根据 NEW.nilai_angka
设置 NEW.nilai_huruf
的值,因为它是一个 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演示
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 ;
这就是答案
我更改触发器上的事件
我想像这样创建触发器,如果学生的分数高于这样 其他列的分数将自动插入值(字母)
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;
有人可以为我解释并提供一些解决方案吗
您不能使用 UPDATE
但您可以根据 NEW.nilai_angka
设置 NEW.nilai_huruf
的值,因为它是一个 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演示
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 ;
这就是答案 我更改触发器上的事件