代码之家  ›  专栏  ›  技术社区  ›  ScArcher2

如何在MySQL触发器中退出一系列if/else条件?

  •  2
  • ScArcher2  · 技术社区  · 14 年前

    我有一个触发器,用于检查更新期间某些字段是否发生了更改。 如果这些字段中的任何一个发生更改,我将更新另一个表。

    我想尽快“突破”国际单项体育联合会的条件,我知道一些变化。

    有没有一种方法可以在MySQL触发器中实现这一点?

    我有什么用,但似乎效率不高。

    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 回复  |  直到 12 年前
        1
  •  5
  •   VoteyDisciple    14 年前

    就是这样 ELSEIF 内在的工作。一旦mysql找到任何通过的条件(即计算结果为true),它将不会计算if..else if..else链中的任何进一步条件。

        2
  •  2
  •   dkretz    14 年前

    尝试案例陈述…

    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
    
        3
  •  1
  •   FrustratedWithFormsDesigner    14 年前

    一个怪物怎么样 OR ing?这意味着只有一个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;
    

    …但是说真的,你的代码很好。没什么好担心的。伏特伊德是对的。

    唯一的另一种清理方法是消除其中的一些条件——尽管这可能不是一个选择。