如果学生的得分高于此值,我想创建这样的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;
有人可以解释并为我提供一些解决方案
答案 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 ;
这是答案 我在触发器上更改事件