2017-11-17 1 views
0

나는 proyect에 대한 모든 테스트가 '준비'있는지 확인하기 위해, 테이블 proyect에 트리거를 생성해야합니다. 그들 모두 준비가되면, 나는 그 proyect를 검색하고 proyect의 상태를 'ready'로 두어야합니다. 그렇지 않은 경우, 불완전합니다.MySQL의 트리거는

UPDATE에 트리거를 하나 만들고 INSERT에 트리거를 하나 만들어야한다는 것을 알고 있습니다. 나는 이런 식으로 계획을 세웠지 만, 나는 그렇게 할 수 없다.

이 솔루션을 만들었습니다.이 솔루션의 총 테스트 수가 해당 프로잭트의 테스트 준비 수보다 적 으면이 프로잭트가 준비되지 않았습니다. 둘 다 같으면 프로 요새가 준비됩니다.

나는 그것이 작동하지 않는 이유를 알고하지 않습니다 오류

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

로드 업데이트-proyect 당신이 그들이 가지고있는 트리거 이상 1 문이있는 경우, update_proyect하는 잘못된 트리거 이름 변경입니다 begin 문과 end 문에서 괄호로 묶여진 후 select는 중괄호로 묶여 야하며, mysql에 == 비교 관계 연산자가 없다. == 또는 null safe equals = < => if 문은 then statement. 최소한이 구문입니다.

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 ; 
+0

통찰력을 얻은 것에 대해 매우 감사드립니다. 정말 도움이 되었어요. 저는 MySQL에 대해 잘 모르고 있었고 PL-SQL을 약간 알고 있습니다. 다시 감사합니다 –