MySQL触发器根据插入和存储的值更新表

时间:2017-11-17 06:25:39

标签: mysql triggers

我必须在表格 proyect 中创建一个触发器,以检查该项目的所有测试是否已准备好'。如果所有这些都准备就绪,我需要搜索这个项目并将项目状态设置为“准备就绪”。如果没有,不完整。

我知道我需要为UPDATE创建一个触发器,为INSERT创建另一个触发器。我已经计划了这样的事情,但是我无法使它发挥作用。

我创建了这个解决方案,如果该项目的测试总数低于该项目的测试准备数,那么proyect就没有准备好。如果两者都是平等的,那么proyect就准备好了。

我不知道为什么它不起作用:

CREATE TRIGGER update-proyect
AFTER INSERT ON tests 
FOR EACH ROW 

SET @total = select COUNT(*)
              from tests
            where IdProyect= NEW.IdProyect;


SET @ready = select COUNT(*)
            from prueba
            from tests
            where IdProyect= NEW.IdProyect 
            AND status = 'ready';

IF (@total == @ready) 
   UPDATE proyect SET status = 'Ready' WHERE IdProyect = NEW.IdProyect;
ELSE
   UPDATE proyect SET status = 'Incomplete' WHERE IdProyect = NEW.IdProyect;
END IF;

1 个答案:

答案 0 :(得分:1)

大量错误update-proyect是对update_proyect的无效触发器名称更改,如果触发器中有多个语句,则必须将它们包含在begin和end语句中,必须在set中包含select之后的select大括号,mysql中没有==比较关系运算符使用=或null safe equals< =&gt ;, if语句必须有then语句。 这至少是语法。

DROP TRIGGER IF EXISTS update_proyect;
DELIMITER $$

CREATE TRIGGER update_proyect
AFTER INSERT ON tests 
FOR EACH ROW 
BEGIN
SET @total = (select COUNT(*)
              from tests
            where IdProyect= NEW.IdProyect
                );

SET @ready = (select COUNT(*)
            from prueba
            #from tests
            where IdProyect= NEW.IdProyect 
            AND status = 'ready'
            );

IF (@total = @ready) THEN
   UPDATE proyect SET status = 'Ready' WHERE IdProyect = NEW.IdProyect;
ELSE
   UPDATE proyect SET status = 'Incomplete' WHERE IdProyect = NEW.IdProyect;
END IF;

END $$

DELIMITER ;