Как выйти из серии условий If / else в триггере mysql? - PullRequest
2 голосов
/ 17 июня 2010

У меня есть триггер, который проверяет, изменились ли определенные поля во время обновления. Если какое-либо из этих полей изменилось, я обновляю другую таблицу.

Я бы хотел "вырваться" из условий if, как только узнаю, что что-то изменилось.

Есть ли способ сделать это в MySQL Trigger?

То, что у меня работает, но кажется неэффективным.

CREATE TRIGGER profile_trigger
BEFORE UPDATE ON profile 
FOR EACH ROW
BEGIN 
DECLARE changed INTEGER;
   SET changed = 0;
IF STRCMP(NEW.first_name, OLD.first_name) <> 0 THEN 
   SET changed = 1;
ELSEIF STRCMP(NEW.last_name, OLD.last_name) <> 0 THEN 
   SET changed = 1;
ELSEIF STRCMP(NEW.maiden_name, OLD.maiden_name) <> 0 THEN 
   SET changed = 1;
ELSEIF STRCMP(NEW.suffix, OLD.suffix) <> 0 THEN 
   SET changed = 1;
ELSEIF STRCMP(NEW.title, OLD.title) <> 0 THEN 
   SET changed = 1;
ELSEIF STRCMP(NEW.gender, OLD.gender) <> 0 THEN 
   SET changed = 1;
ELSEIF STRCMP(NEW.street, OLD.street) <> 0 THEN 
   SET changed = 1;
ELSEIF STRCMP(NEW.street2, OLD.street2) <> 0 THEN 
   SET changed = 1;
ELSEIF STRCMP(NEW.city, OLD.city) <> 0 THEN 
   SET changed = 1;
ELSEIF STRCMP(NEW.state, OLD.state) <> 0 THEN 
   SET changed = 1;
ELSEIF STRCMP(NEW.zip, OLD.zip) <> 0 THEN 
   SET changed = 1;
ELSEIF STRCMP(NEW.home_phone, OLD.home_phone) <> 0 THEN 
   SET changed = 1;
ELSEIF NEW.date_of_birth <> OLD.date_of_birth THEN
   SET changed = 1;
END IF;
IF changed > 0 THEN
    update other_table set updated = CURRENT_TIMESTAMP where id = NEW.id;
END IF;
END; 
|

Ответы [ 3 ]

5 голосов
/ 17 июня 2010

Вот так ELSEIF работает по своей сути.Как только MySQL находит любое условие, которое проходит (то есть, оценивается как ИСТИНА), он не будет оценивать дальнейшие условия в цепочке IF..ELSEIF..ELSE.

2 голосов
/ 17 июня 2010

Попробуйте оператор CASE ...

SET changed = CASE
   WHEN STRCMP(NEW.first_name, OLD.first_name) <> 0 THEN 1
   WHEN STRCMP(NEW.last_name, OLD.last_name) <> 0  THEN 1
   WHEN STRCMP(NEW.maiden_name, OLD.maiden_name) <> 0  THEN 1
   ...
   ELSE 0
END
1 голос
/ 17 июня 2010

Как насчет одного монстра OR -ов?это будет означать только один оператор if;)

IF STRCMP(NEW.first_name, OLD.first_name) <> 0 or
   STRCMP(NEW.last_name, OLD.last_name) <> 0 or
   STRCMP(NEW.maiden_name, OLD.maiden_name) <> 0 or ...
   ...
   SET changed = 1;
end if;

IF changed > 0 THEN
    update other_table set updated = CURRENT_TIMESTAMP where id = NEW.id;
END IF;

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

Единственный другой способ исправить это - удалить некоторые из этих условий - хотя, вероятно, это не вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...