2013-03-09 3 views
0

내가 원하는 것은 새로운 학생의 학년 속성을 관리하는 것입니다. 학생 ID와 학년이 포함 된 삽입 된 튜플의 등급 값이 9보다 작거나 12보다 큰 경우이 값을 NULL로 변경하려고합니다. 동시에 null 값을 갖는 삽입 된 튜플을 9로 변경하려고합니다.SQLLite에서 다중 업데이트 트리거

다음 코드가 잘못되었습니다.

CREATE TRIGGER R1 
AFTER INSERT ON Students 
FOR EACH ROW 
BEGIN 

    UPDATE Students 
    SET grade = NULL 
    WHERE grade < 9 OR grade > 12; 

    UPDATE Students 
    SET grade = 9 
    WHERE grade = NULL; 

END; 

두 개의 UPDATE 문은 INSERT가 실행 된 직후 Student 테이블에서 수행되어야합니다.

UPDATE Students 
    SET grade = 9 
    WHERE grade IS NULL; 

증명 = NULLIS NULL로 : 우리는 null 값을 가질 것이다> 9> 12 업데이트 할 당신은 = NULL에서 IS NULL에 두 번째 조건을 교체해야

+0

안녕하세요, 조금 쿼리를 다시 포맷하고 모든 SQL 키워드를 대문자로. 희망은 내가 F'd하지 않았다 :) http://www.sqlite.org/lang_createtrigger.html Waitaminute,'grade = NULL'은'grade IS NULL'이 아니어야합니까 ??? – biziclop

+0

첫 번째 실행 후 두 번째 업데이트가 수행된다는 잘못된 결과를 반환합니다 ... 내가 원하는 것은 둘 다 동시에 수행된다는 것입니다. –

+0

동시에 실행할 수는 없으므로 불가능합니다. 그것들은 순차적으로 만 실행할 수 있습니다. 귀하의 질문에 두 업데이 트가 테이블의 모든 행을 업데이 트합니다 (NULL 또는 9.112가 아님). 예를 들어'NEW.id'를 사용하여 업데이트하려는 행을 정확히 지정해야합니다. 그렇지 않으면 모든 잘못된 등급은 각 INSERT 후에'NULL' /'9' 사이에서 플립 플롭합니다. – biziclop

답변

1

을 NULL로 등급 9 등급으로 업데이트하기 : http://sqlfiddle.com/#!5/a51de/1

다른 솔루션 :

http://sqlfiddle.com/#!5/78288/1

CREATE TRIGGER TStudents3 
AFTER INSERT ON Students3 
FOR EACH ROW 
/* we check update conditions here */ 
WHEN NEW.grade IS NULL 
    OR NEW.grade < 9 
    OR NEW.grade > 12 
BEGIN 

    UPDATE Students3 
    SET grade = 
     CASE 
     WHEN grade IS NULL THEN 9 
     /* actually you could drop this 2 lines, because a missing ELSE returns NULL: */ 
     WHEN grade < 9 OR grade > 12 THEN NULL 
     ELSE grade 
     END 
    /* We just want to update the freshly inserted row, not all row! */ 
    WHERE id = NEW.id; 

END 
+0

두 업데이트가 동시에 실행되지 않는 것 같습니다. 즉, NULL 값을 갖지 않을 것이지만 대신 삽입 된 새 튜플에 <9 OR 그레이드> 12 –

0

이 작업을 수행하는 또 다른 방법은 WHERE 절에 조건을 이동하는 것입니다 :

CREATE TRIGGER tr1 AFTER INSERT ON Student 
BEGIN 
    UPDATE Student SET grade = null WHERE id = NEW.id and (new.grade<9 or new.grade>12); 
    UPDATE Student SET grade = 9 WHERE id = NEW.id and new.grade is null; 
END;