Используйте оператор Case внутри блока if else в триггерах mysql - PullRequest
0 голосов
/ 13 мая 2018

Я новичок в триггерах MySQL.Предположим, если у меня есть имя таблицы teacher содержит

teacher_id,
teacher_name,
description,
student_id,
class,
student_year 

Я хочу создать триггеры AFTER INSERT и AFTER UPDATE на таблице преподавателей.для этого у меня есть имя таблицы с именем teacherlogs с id, teacher_id, student_year, class, student_id столбцы

, поэтому всякий раз, когда запись вставляется в таблицу teacher , она должна быть вставлена ​​в teacherlogs . (Для этого триггера, способного писать)

Но для проблемы, возникшей после обновления триггера.

Требование :

всякий раз, когда student_id изменено в teacher таблице, мы должны вставить запись в teacherlogs вместе с другими изменениями в столбцах таблицы учителя для этой записи, для этого я написал так:

  IF ((NEW.student_id <=> OLD.student_id) = 0) Then
    select student_id,class,student_year into student_id_,class_,year_ from `employees`.`teachers` where teacher_id = OLD.teacher_id;
    Insert into `employees`.`teacherlogs`(teacher_id,student_year,class,student_id) values (OLD.teacher_id,year_,class_,student_id_);
    END IF;

Но всякий раз, когда изменения в других столбцах, таких как class, student_year, нам нужно обновить таблицу teacherlogs для этой записи, где teacher_id и student_id

Final TriggerЗапрос

create trigger `updateteacherlogs`
AFTER UPDATE ON `employees`.`teacher` FOR EACH ROW 
BEGIN
    DECLARE teacher_id_ int(11);
    Declare student_id_ int(11);
    Declare class_ varchar(150);
    Declare year_ int(11);
    Declare dummy tinyint;

    IF ((NEW.student_id <=> OLD.student_id) = 0) Then
    select student_id,class,student_year into student_id_,class_,year_ from `employees`.`teachers` where teacher_id = OLD.teacher_id;
    Insert into `employees`.`teacherlogs`(teacher_id,student_year,class,student_id) values (OLD.teacher_id,year_,class_,student_id_);
    ELSE
         CASE WHEN (NEW.student_year <=> OLD.student_year) = 0
         THEN update `teacherlogs` set student_year = NEW.student_year where student_id=OLD.student_id and teacher_id = OLD.teacher_id;
         WHEN (NEW.class <=> OLD.class) = 0
         THEN update `teacherlogs` set class = NEW.class where student_id=OLD.student_id and teacher_id = OLD.teacher_id
         ELSE select @dummy  END 

    end if;
END

Но в конце я получаю исключение, если.

- это правильный способ решения моей проблемы или каким-либо другим способом мы можем это сделать?

1 Ответ

0 голосов
/ 13 мая 2018

Причина вашей синтаксической ошибки в том, что ваш оператор CASE должен заканчиваться END CASE;, а не просто END.

Я не думаю, что оператор CASE действительно работает для ваших требований, хотя, как если бы NEW.student_year <=> OLD.student_year, тогда NEW.class не будет сравниваться с OLD.class, чтобы увидеть, нужно ли обновлять это значение. Это потому, что (из руководства ):

Для второго синтаксиса каждое выражение предложения WHEN search_condition имеет вид оценивается до тех пор, пока одно из них не станет истинным, после чего предложение Statement_list выполняет

Вы можете обойти это, просто заменив ELSE CASE ... предложением ELSEIF:

ELSEIF NEW.student_year <=> OLD.student_year OR NEW.class <=> OLD.class THEN
UPDATE teacherlogs
  SET student_year = NEW.student_year, class = NEW.class 
  WHERE student_id = OLD.student_id AND teacher_id = OLD.teacher_id;

Это должно работать, потому что (исходя из моего понимания вашего вопроса о том, как сконфигурирована ваша база данных), значения student_year и class в teacherlogs должны совпадать с OLD.student_year и OLD.class, и если они такие же, как NEW.student_year и NEW.class, значения не будут обновляться.

Если мое понимание неверно, вам нужно изменить обновление, чтобы иметь условия для каждого значения:

ELSE
    UPDATE teacherlogs
    SET student_year = IF(NEW.student_year <=> OLD.student_year, NEW.student_year, student_year),
    class = IF(NEW.class <=> OLD.class, NEW.class, class)
    -- repeat for all columns
    WHERE student_id = OLD.student_id AND teacher_id = OLD.teacher_id;
END IF;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...